[toc]
为什么要这样做
博主要寒假回家我的文竹要有人浇水,因此要搞一个自动浇花的. 看了很多解决方案,这个websocket长连接加主动推送感觉很合适. 毕竟我要通过手机来远程控制,这样通过手机访问服务器,然后服务器发送控制命令到控制装置(websocket协议)正好;
stomp
以前博主也搞过stomp 加 sockjs 的 因为在python上与服务器上java后台连接,所以要配置一下java
以前的博客能帮你了解一下websockethttps://boke.maoxiaomiyy.com/?p=971
要想不使用sockjs 就只要把原来的stompEndpointRegistry.addEndpoint("/my-websocket").withSockJS();
中.withSockJS()去掉即可
配置代码如下
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
stompEndpointRegistry.addEndpoint("/my-websocket");
}
}
stomp的修改参考:https://segmentfault.com/a/1190000006617344
在stomp的生成是 如果是sockjs 就使用
var socket = new SockJS('/my-websocket'); //1
stompClient = Stomp.over(socket);
没有sockjs 就是原生url连接即可
stompClient=Stomp.client("ws://localhost:5002/my-websocket");
stompClient.connect({}, function(frame) {//3
stompClient.subscribe('/chat', function(respnose){ //4
alert("olll")
alert(respnose.date);
});
});
原生配置
网上大部分都是基于stomp 和sockjs的
我这是原生的 spring websocket
@Configuration
@EnableWebSocket
public class WebSocketBaseConf implements WebSocketConfigurer {
class MyHandler extends TextWebSocketHandler{
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) {
//System.out.println(message);
System.out.println(message.getPayload());
try {
session.sendMessage(new TextMessage("ke yi de"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
webSocketHandlerRegistry.addHandler(new MyHandler(), "/myHandler");
}
}
前端
var ws=new WebSocket("ws://localhost:5002/myHandler");
ws.onopen=function () {
// ws.send("we are ok");
console.info("连接成功");
}
ws.onmessage=function (msg) {
console.info(msg);
$("#webinfo").html(msg.data);
}
python 的websocket客户端
在python官网上找到一个例子可以使用的
点击查看:https://pypi.python.org/pypi/websocket-client
首先安装模块 pip install websocket-client
树莓派上要su权限
import websocket
import mywebsocket
def on_message(ws, message):
print(message);
#ws.send("已收到");
mywebsocket.readOp(message);
def on_error(ws, error):
print(error)
def on_close(ws):
print("### closed ###")
def on_open(ws):
print("到 zhe")
#print("zhe li")
ws.send("jjj")
if __name__ == "__main__":
ws = websocket.WebSocketApp("ws://localhost:5002/myHandler",
on_message = on_message,
on_error = on_error,
on_close = on_close)
ws.on_open = on_open
print("ok")
ws.run_forever()
ws.run_forever是为了保持长连接的, 然后是模仿js的使用方式
在接受数据后就可以在 on_message中处理了,我是写了另外一个处理文件的,毕竟gpio
结语
至此整个框架搭建完毕,明天开始开发网页控制,和树莓派的gpio
回复 树莓派–手机远程浇花系统郏俊龙个人博客 | 郏俊龙个人博客 取消回复