【平头哥RVB2601开发板试用体验】TCP_SEVER 通信
[复制链接]
本帖最后由 lugl4313820 于 2022-4-4 00:25 编辑
我的智能冷库管理系统,首先要搭建:服务器、wifi、传感器。目前项目的设计是用RVB采集到温度、冷库供电电压,工作电流,然后通过网络发送到我服务器。
1、首先建立TCP服务器:我采用的中tornado来建立自己的服务器。
class DeviceServer(TCPServer):
def __init__(self, account, servernum):
super(DeviceServer, self).__init__()
self.account = account
self.servernum = servernum
# 接收客户端连接请求
@gen.coroutine
def handle_stream(self, stream, address):
conn = Connection(self.account, self.servernum, stream, address)
yield conn.send_messages()
class Connection(object):
clients = set() # 客户端对象
def __init__(self, account, servernum, stream, address):
Connection.clients.add(self)
self.account = account
self.servernum = servernum
self._read_future = None
self._stream = stream # TCP对象
self._address = address # TCP地址
self.heart_count = 0 # 设备发送心跳包次数
self.previous_order = 'rvb2601\r\n' # 上一条指令默认为回复心跳包
self.machine_code = '' # 机器编号
self.tcp_is_activate = True # tcp通道是否保持连接
self._stream.set_close_callback(self.on_close) # tcp通道关闭后相关变量处理函数
print('第{}个客户端,地址:{}'.format(len(self.__class__.clients),self._address))
def main():
# 程序入口
port = 3333
ip = '0.0.0.0'
kill_port_process(port)
asyncio.set_event_loop(asyncio.new_event_loop())
server = DeviceServer('lugl', 'rvb_server')
print('启动服务器')
# 启动服务器前先杀死端口
server.listen(port=port, address=ip)
IOLoop.instance().start()
if __name__ == '__main__':
main()
这样搭建好了基础的服务器框架。
2、根据网友的文章在demo上修改代码实现wifi建接服务器:i
f (app_netmgr_hdl) {
utask_t *task = utask_new("netmgr", 2 * 1024, QUEUE_MSG_COUNT, AOS_DEFAULT_APP_PRI);
netmgr_service_init(task);
netmgr_config_wifi(app_netmgr_hdl, "HUAWEI-H10R9U", sizeof("HUAWEI-H10R9U"), "18977381885@", sizeof("18977381885@"));
w800_packet_input_cb_register(&w800_data_receive_callback);//这里注册接收到数据的回调函数。
netmgr_start(app_netmgr_hdl);
}
void w800_data_receive_callback(int linkid, void *data, size_t len, char remote_ip[16], uint16_t remote_ports)
{
uint8_t *buf;
buf = (uint8_t *)data;
if(len == 0)
{
return;
}
LOGE(TAG,"receive data len: %d\r\n",len);
LOGE(TAG,"receive data:");
for(uint16_t i = 0; i < len; i++)
{
printf("%c ",buf);
}
LOGE(TAG,"\r\n");
}
注册两个函数,一个用于连接服务器,一个用于测试发送数据:
static void cmd_at_client_handler(char *wbuf, int wbuf_len, int argc, char **argv)
{
const uint8_t pdata[] = "Hello RVB2601!\r\n";
int len = sizeof(pdata);
int timeout=120;
w800_send_data(pdata, len, timeout);
}
static void connect_tcp_server_handler(char *server_ip, uint16_t port)
{
char ssid[32];
int bssid[6];
int channel;
int rssi;
server_ip = "192.168.3.192";
port = 3333;
w800_ap_info( ssid, bssid , &channel, &rssi);
printf("ssid: %s\r\n", ssid);
printf("channel: %d\r\n", channel);
printf("rssi: %d\r\n", rssi);
w800_connect_remote(0, 2, server_ip, port);
}
实验现象:
到此,RVB2601与服务器的通信建立,下一步采集数据并上传服务器,服务器建立数据接收保存。
疑问:目前平头哥的AT指令只支持tcp_clien,不知道可不可以用WM_W800_SDK中的AT指令。
|