From 6b1f0ab9155b0a9c8e5aaa639c2b95e263c07495 Mon Sep 17 00:00:00 2001 From: sunchunyang Date: Sun, 8 Oct 2023 16:53:54 +0800 Subject: [PATCH] =?utf8?q?=E6=B7=BB=E5=8A=A0=20=E6=8C=87=E4=BB=A4=20scan?= =?utf8?q?=20lamp=20pwr=20brightness=20etc.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- gs200_test | Bin 37536 -> 0 bytes obj/encryption.o | Bin 1808 -> 0 bytes obj/gs200_msg_codec.o | Bin 8448 -> 0 bytes obj/main.o | Bin 11768 -> 0 bytes obj/utils.o | Bin 4648 -> 0 bytes obj/utils_shell_cmd.o | Bin 8056 -> 0 bytes obj/utils_socket_udp.o | Bin 4840 -> 0 bytes obj/utils_uart.o | Bin 8672 -> 0 bytes src/gs200_msg.h | 68 ++++++++++++++++++++++- src/gs200_msg_codec.c | 113 ++++++++++++++++++++++++++++++++++--- src/main.c | 123 ++++++++++++++++++++++++++++++++--------- src/utils.c | 5 +- src/utils.h | 3 +- src/utils_shell_cmd.c | 82 ++++++++++++++++++++++++--- 14 files changed, 348 insertions(+), 46 deletions(-) delete mode 100755 gs200_test delete mode 100644 obj/encryption.o delete mode 100644 obj/gs200_msg_codec.o delete mode 100644 obj/main.o delete mode 100644 obj/utils.o delete mode 100644 obj/utils_shell_cmd.o delete mode 100644 obj/utils_socket_udp.o delete mode 100644 obj/utils_uart.o diff --git a/gs200_test b/gs200_test deleted file mode 100755 index 585fe46c821a8be3a3f19d57cc805ecf1226d5e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37536 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 diff --git a/obj/main.o b/obj/main.o deleted file mode 100644 index bba63e3bd794b539899744fe18ce2aab247b5091..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11768 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 BtL6Xz diff --git a/obj/utils_socket_udp.o b/obj/utils_socket_udp.o deleted file mode 100644 index 508aee5e011c58b25aacb1a0a2ff02a381aeb73f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4840 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 WxLOvzrFz#tNB*}-D^n-E{=WgoE{AXc diff --git a/src/gs200_msg.h b/src/gs200_msg.h index 4ec687a..b3c7cc1 100644 --- a/src/gs200_msg.h +++ b/src/gs200_msg.h @@ -60,6 +60,14 @@ enum{ DEV_TYPE_ENVIRONMENT_SENSOR=0x0F,// 0f是环境传感器 } device_type_enum; +enum{ + ADDRESS_TYPE_INVALID=0x0000, //无效(未分配地址) + ADDRESS_TYPE_SINGLEADDR_MASK_0=0x0000,//单播地址 0xxx xxxx xxxx xxxx ADDRESS_TYPE_SINGLEADDR_MASK & 0xC000 == 0x0000 || 0x4000 + ADDRESS_TYPE_SINGLEADDR_MASK_4=0x4000,//单播地址 0xxx xxxx xxxx xxxx ADDRESS_TYPE_SINGLEADDR_MASK & 0xC000 == 0x0000 || 0x4000 + ADDRESS_TYPE_VIRTUALADDR_MASK=0x8000,//虚拟地址 10xx xxxx xxxx xxxx ADDRESS_TYPE_VIRTUALADDR_MASK & 0xC000 == 0x8000 + ADDRESS_TYPE_GROUPADDR_MASK=0xC000,//群组地址 11xx xxxx xxxx xxxx ADDRESS_TYPE_GROUPADDR_MASK & 0xC000 == 0xC000 + ADDRESS_TYPE_BROADCAST_ADDR=0xFFFF,//广播地址 +} address_mask_enum; /********* @@ -75,6 +83,7 @@ enum { OPC_QUIT_SCAN_SET=0x05,// 无 无 退出扫描设备 OPC_BEACON=0x0A,//无 1Byte 设备类型 ○1 +5Byte 软件版本号 +3Byte 支持硬件配置+ 1Byte 支持该配置的硬件版本 + 版本标签 ○2 Beacon 帧 OPC_HEART_BEAT_STS=0x0B,// 无 1Byte 设备类型 + 16Byte 用户自定义 数据心跳包 + OPC_HUMAN_PRESENCE_STS=0x0C,// 人体感应Sensor,人体存在消息 OPC_GROUPING_SET=0x10,// 无 6Byte,组地址+网络ID+网络密码遥控器专用指令,复制组地址、网络 ID、网络密码 OPC_ADD_NBR_SET=0x11,// 无 2Byte,邻组地址 遥控器专用指令,添加邻组地址 OPC_DEL_NBR_SET=0x12,// 无 2Byte,邻组地址 遥控器专用指令,删去邻组地址 @@ -204,6 +213,7 @@ enum { OPC_REPORT_SETTING_STS=0x5D, } opcode_enum; + #pragma pack(1) typedef struct { @@ -240,6 +250,47 @@ typedef struct uint8_t seconds;//Beacon 帧发 送周期,单位:秒 扫描设备设置,设备收到后持续发送 BEACON 帧 }BeaconBroadcastCycle_t; + + +#pragma pack(1) +typedef struct +{ + uint8_t device_type;// 6Byte,1Byte 设备类型 + version_t version;//+5Byte 软件版本 +}opc_dev_info_sts_t; + + +#pragma pack(1) +typedef struct +{ + uint8_t device_type;// 1Byte 设备类型 + + uint32_t power_on_duration;//12Byte 使用信息 ( 4Byte 通电时长 + uint32_t sensor_on_duration;//+4Byte 传感器感应时长 + uint32_t power_on_weighted_duration;//+4Byte 通电加权时长) +}opc_use_info_sts_t; + +#pragma pack(1) +typedef struct +{ + uint8_t dpid; //0x12 + union + { + uint8_t lamp_mode;// 1Byte,控制模式。0x00:传感器自动控制,0x01:常灭,0x02:休眠,0x03:常亮 + uint8_t lamp_brightness;// 1Byte,亮灯状态亮度,0-255 + }lamp_sts; +}opc_lamp_sts_t; + +#pragma pack(1) +typedef struct +{//OPC_HEART_BEAT_SETTING_STS + uint8_t dpid; //0x02 + union + { + uint8_t heartbeat_cycle;//1Byte, 心跳消息周 期, Bit7-Bit1:值,Bit0:单位,1 为分钟,0 为秒 + uint8_t heartbeat_switch;//1Byte, 心跳消息开关 + }heartbeat_set; +}opc_heartbeat_sts_t; + #pragma pack(1) typedef struct { @@ -276,10 +327,13 @@ typedef struct uint16_t network_id; uint8_t opcode; //填写数据为:opcode_enum union { - BeaconBroadcastCycle_t beaconbroadcastcycle; BeaconData_t beacondata; heartbeat_t heartbeat; + opc_dev_info_sts_t dev_info_sts; + opc_use_info_sts_t use_info_sts; + opc_lamp_sts_t lamp_sts; + opc_heartbeat_sts_t heartbeat_sts; uint8_t params[20];//操作指令参数最大值 } frame_data; } nwk_frame_t; @@ -308,7 +362,6 @@ typedef struct uint8_t snr; uint8_t uuid[6]; uint16_t src_addr; - uint16_t target_addr; uint16_t network_id; uint16_t password; uint16_t group_id; @@ -320,6 +373,7 @@ typedef struct uint8_t hw_version; uint8_t cycle_seconds;//Beacon 帧发 送周期,单位:秒 扫描设备设置,设备收到后持续发送 BEACON 帧 uint64_t utc_time_stamp; + uint16_t parent_serial_port; //接收到设备消息的dongle 所属的串口,(主要解决 网关 可能连接一usb拖多dongle的 设备管理问题) }gs200_device_item_t; @@ -364,7 +418,7 @@ int encode_msg(gs200_msg_t* gs200_msg_in,gs200_msg_encrypted_t *gs200_msg_encryp int gen_gs200_msg_stop_scan(uint16_t area_id,uint16_t src_addr, uint16_t target_addr, uint8_t uuid[6],gs200_msg_encrypted_t *gs200_msg_encrypted_out); -int gen_gs200_msg_start_scan(uint16_t area_id,uint16_t src_addr, uint16_t target_addr, uint8_t uuid[6],uint8_t beacon_send_cycle_in_seconds,gs200_msg_encrypted_t *gs200_msg_encrypted_out); +int gen_gs200_msg_start_scan(uint8_t beacon_send_cycle_in_seconds,uint16_t area_id,uint16_t src_addr, uint16_t target_addr, uint8_t uuid[6],gs200_msg_encrypted_t *gs200_msg_encrypted_out); int gen_gs200_msg_get_dongle_version(gs200_msg_encrypted_t *gs200_msg_encrypted_out); @@ -373,4 +427,12 @@ int gen_gs200_msg_get_dongle_uuid(gs200_msg_encrypted_t *gs200_msg_encrypted_out int gen_gs200_msg_get_dongle_networksetting(gs200_msg_encrypted_t *gs200_msg_encrypted_out); + + +int gen_gs200_msg_lamp_power(uint8_t poweron,uint16_t area_id,uint16_t src_addr, uint16_t target_addr, uint8_t uuid[6], gs200_msg_encrypted_t *gs200_msg_encrypted_out); +int gen_gs200_msg_lamp_brightness(uint8_t brightness,uint16_t area_id,uint16_t src_addr, uint16_t target_addr, uint8_t uuid[6], gs200_msg_encrypted_t *gs200_msg_encrypted_out); +int gen_gs200_msg_heartbeat_cycle(uint8_t cycle,uint16_t area_id,uint16_t src_addr, uint16_t target_addr, uint8_t uuid[6], gs200_msg_encrypted_t *gs200_msg_encrypted_out); + + + #endif // __gs200_MSG_H__ diff --git a/src/gs200_msg_codec.c b/src/gs200_msg_codec.c index 1af0142..ba6c966 100644 --- a/src/gs200_msg_codec.c +++ b/src/gs200_msg_codec.c @@ -176,11 +176,16 @@ int encode_msg(gs200_msg_t* gs200_msg_in,gs200_msg_encrypted_t *gs200_msg_encryp uint16_t crc = getModbusCRC16(((char*)gs200_msg_encrypted_out)+2,gs200_msg_encrypted_out->size+1); uint16_t *pcrc = ((char*)gs200_msg_encrypted_out) +gs200_msg_encrypted_out->size+2+1; *pcrc = crc; + /** + * head size encrypted_data modbus_crc16 + * 2B 1B 0~36B 2B + */ + // print_hex_arr((char*)gs200_msg_encrypted_out,gs200_msg_encrypted_out->size+5); return gs200_msg_encrypted_out->size + 2 + 2 + 1; } /*********************指令生成函数********************************/ -int gen_gs200_msg_start_scan(uint16_t area_id,uint16_t src_addr, uint16_t target_addr, uint8_t uuid[6],uint8_t beacon_send_cycle_in_seconds,gs200_msg_encrypted_t *gs200_msg_encrypted_out){ +int gen_gs200_msg_start_scan(uint8_t beacon_send_cycle_in_seconds,uint16_t area_id,uint16_t src_addr, uint16_t target_addr, uint8_t uuid[6],gs200_msg_encrypted_t *gs200_msg_encrypted_out){ gs200_msg_t gs200_msg_in = {0}; gs200_msg_in.cmd_type = UART_CMD_CODE_SEND; gs200_msg_in.msg.nwk_frame.opcode = OPC_SCAN_DEV_SET; @@ -191,9 +196,15 @@ int gen_gs200_msg_start_scan(uint16_t area_id,uint16_t src_addr, uint16_t target memcpy(gs200_msg_in.msg.nwk_frame.uuid ,uuid,sizeof(uuid)); gs200_msg_in.msg.nwk_frame.frame_data.beaconbroadcastcycle.seconds = beacon_send_cycle_in_seconds; //1秒发送一次beacon数据 gs200_msg_in.size = (13+2);//13B msg.len + 1B size+ 1B beaconbroadcastcycle - + /** + * 信号强度 设备识别号 设备地址 发布地址 网络 ID 操作指令 + 1B 6B 2B 2B 2B 2B + */ dump_msg(&gs200_msg_in); - return encode_msg(&gs200_msg_in,gs200_msg_encrypted_out); + int ret = encode_msg(&gs200_msg_in,gs200_msg_encrypted_out); + print_hex_arr(&gs200_msg_in,gs200_msg_encrypted_out->size); + print_hex_arr(gs200_msg_encrypted_out,gs200_msg_encrypted_out->size+5); + return ret; } int gen_gs200_msg_stop_scan(uint16_t area_id,uint16_t src_addr, uint16_t target_addr, uint8_t uuid[6],gs200_msg_encrypted_t *gs200_msg_encrypted_out){ @@ -208,7 +219,10 @@ int gen_gs200_msg_stop_scan(uint16_t area_id,uint16_t src_addr, uint16_t target_ gs200_msg_in.size = (13+1); //13B msg.len+ 1B size dump_msg(&gs200_msg_in); - return encode_msg(&gs200_msg_in,gs200_msg_encrypted_out); + int ret = encode_msg(&gs200_msg_in,gs200_msg_encrypted_out); + print_hex_arr(&gs200_msg_in,gs200_msg_encrypted_out->size); + print_hex_arr(gs200_msg_encrypted_out,gs200_msg_encrypted_out->size+5); + return ret; } @@ -216,19 +230,104 @@ int gen_gs200_msg_get_dongle_version(gs200_msg_encrypted_t *gs200_msg_encrypted_ gs200_msg_t gs200_msg_in = {0}; gs200_msg_in.cmd_type = UART_CMD_CODE_GET_VER; gs200_msg_in.size = 0; - return encode_msg(&gs200_msg_in,gs200_msg_encrypted_out); + int ret = encode_msg(&gs200_msg_in,gs200_msg_encrypted_out); + print_hex_arr(&gs200_msg_in,gs200_msg_encrypted_out->size); + print_hex_arr(gs200_msg_encrypted_out,gs200_msg_encrypted_out->size+5); + return ret; } int gen_gs200_msg_get_dongle_uuid(gs200_msg_encrypted_t *gs200_msg_encrypted_out){ gs200_msg_t gs200_msg_in = {0}; gs200_msg_in.cmd_type = UART_CMD_CODE_GET_UID; gs200_msg_in.size = 0; - return encode_msg(&gs200_msg_in,gs200_msg_encrypted_out); + int ret = encode_msg(&gs200_msg_in,gs200_msg_encrypted_out); + print_hex_arr(&gs200_msg_in,gs200_msg_encrypted_out->size); + print_hex_arr(gs200_msg_encrypted_out,gs200_msg_encrypted_out->size+5); + return ret; } int gen_gs200_msg_get_dongle_networksetting(gs200_msg_encrypted_t *gs200_msg_encrypted_out){ gs200_msg_t gs200_msg_in = {0}; gs200_msg_in.cmd_type = UART_CMD_CODE_GET_NWK; gs200_msg_in.size = 0; - return encode_msg(&gs200_msg_in,gs200_msg_encrypted_out); + int ret = encode_msg(&gs200_msg_in,gs200_msg_encrypted_out); + print_hex_arr(&gs200_msg_in,gs200_msg_encrypted_out->size); + print_hex_arr(gs200_msg_encrypted_out,gs200_msg_encrypted_out->size+5); + return ret; +} + +int gen_gs200_msg_lamp_power(uint8_t poweron,uint16_t area_id,uint16_t src_addr, uint16_t target_addr, uint8_t uuid[6], gs200_msg_encrypted_t *gs200_msg_encrypted_out){ + gs200_msg_t gs200_msg_in = {0}; + gs200_msg_in.cmd_type = UART_CMD_CODE_SEND; + gs200_msg_in.msg.nwk_frame.opcode = OPC_LAMP_SETTING_SET; + gs200_msg_in.msg.nwk_frame.snr = 0; + gs200_msg_in.msg.nwk_frame.network_id = area_id; + gs200_msg_in.msg.nwk_frame.src_addr = src_addr; + gs200_msg_in.msg.nwk_frame.target_addr = target_addr; + memcpy(gs200_msg_in.msg.nwk_frame.uuid ,uuid,sizeof(uuid)); + + gs200_msg_in.msg.nwk_frame.frame_data.lamp_sts.dpid = 0x12; + + if(poweron){ + gs200_msg_in.msg.nwk_frame.frame_data.lamp_sts.lamp_sts.lamp_mode = 0x01; + }else{ + gs200_msg_in.msg.nwk_frame.frame_data.lamp_sts.lamp_sts.lamp_mode = 0x11; + } + gs200_msg_in.size = (13+1+2); //13B msg.len+ 1B size + 1B dpid + 1B lamp_mode + + dump_msg(&gs200_msg_in); + int ret = encode_msg(&gs200_msg_in,gs200_msg_encrypted_out); + print_hex_arr(&gs200_msg_in,gs200_msg_encrypted_out->size); + print_hex_arr(gs200_msg_encrypted_out,gs200_msg_encrypted_out->size+5); + return ret; +} + +int gen_gs200_msg_lamp_brightness(uint8_t brightness,uint16_t area_id,uint16_t src_addr, uint16_t target_addr, uint8_t uuid[6], gs200_msg_encrypted_t *gs200_msg_encrypted_out){ + gs200_msg_t gs200_msg_in = {0}; + gs200_msg_in.cmd_type = UART_CMD_CODE_SEND; + gs200_msg_in.msg.nwk_frame.opcode = OPC_QUIT_SCAN_SET; + gs200_msg_in.msg.nwk_frame.snr = 0; + gs200_msg_in.msg.nwk_frame.network_id = area_id; + gs200_msg_in.msg.nwk_frame.src_addr = src_addr; + gs200_msg_in.msg.nwk_frame.target_addr = target_addr; + memcpy(gs200_msg_in.msg.nwk_frame.uuid ,uuid,sizeof(uuid)); + + gs200_msg_in.msg.nwk_frame.frame_data.lamp_sts.dpid = 0x13; + + gs200_msg_in.msg.nwk_frame.frame_data.lamp_sts.lamp_sts.lamp_brightness = brightness; + + gs200_msg_in.size = (13+1+2); //13B msg.len+ 1B size + 1B dpid + 1B lamp_brightness + + dump_msg(&gs200_msg_in); + int ret = encode_msg(&gs200_msg_in,gs200_msg_encrypted_out); + print_hex_arr(&gs200_msg_in,gs200_msg_encrypted_out->size); + print_hex_arr(gs200_msg_encrypted_out,gs200_msg_encrypted_out->size+5); + return ret; } + + +int gen_gs200_msg_heartbeat_cycle(uint8_t cycle,uint16_t area_id,uint16_t src_addr, uint16_t target_addr, uint8_t uuid[6], gs200_msg_encrypted_t *gs200_msg_encrypted_out){ + + + // GS200_LOGD("gen_gs200_msg_heartbeat_cycle %d \r\n",cycle); + gs200_msg_t gs200_msg_in = {0}; + gs200_msg_in.cmd_type = UART_CMD_CODE_SEND; + gs200_msg_in.msg.nwk_frame.opcode = OPC_HEART_BEAT_SETTING_SET; + gs200_msg_in.msg.nwk_frame.snr = 0; + gs200_msg_in.msg.nwk_frame.network_id = area_id; + gs200_msg_in.msg.nwk_frame.src_addr = src_addr; + gs200_msg_in.msg.nwk_frame.target_addr = target_addr; + memcpy(gs200_msg_in.msg.nwk_frame.uuid ,uuid,sizeof(uuid)); + + gs200_msg_in.msg.nwk_frame.frame_data.heartbeat_sts.dpid = 0x02; + + gs200_msg_in.msg.nwk_frame.frame_data.heartbeat_sts.heartbeat_set.heartbeat_cycle = (cycle<<1); + + gs200_msg_in.size = (13+1+2); //13B msg.len+ 1B size + 1B dpid + 1B heartbeat_cycle + + dump_msg(&gs200_msg_in); + int ret = encode_msg(&gs200_msg_in,gs200_msg_encrypted_out); + print_hex_arr(&gs200_msg_in,gs200_msg_encrypted_out->size); + print_hex_arr(gs200_msg_encrypted_out,gs200_msg_encrypted_out->size+5); + return ret; +} \ No newline at end of file diff --git a/src/main.c b/src/main.c index 48e9645..e44a874 100644 --- a/src/main.c +++ b/src/main.c @@ -72,15 +72,18 @@ int get_device_index(uint8_t UUID[6]){ int found_uuid_index=-1; for (int i =0 ; i < MAX_DEVICE_LIST_COUNT; i++) { - if(first_empty_uuid_index!=-1 && devicelist[i].src_addr == 0) + + if(first_empty_uuid_index == -1 && devicelist[i].src_addr == 0) { first_empty_uuid_index = i; + } if(mstrncmp((char*)UUID,(char*)devicelist[i].uuid,6)==0 ){ found_uuid_index = i; break; } } + // GS200_LOGD("first_empty_uuid_index %d .found_uuid_index %d\r\n",first_empty_uuid_index,found_uuid_index); if(found_uuid_index == -1 ){ return first_empty_uuid_index; // 如果没找到对应的设备,返回第一个空设备赋值,如果已经满了,返回的就是-1 } @@ -88,14 +91,19 @@ int get_device_index(uint8_t UUID[6]){ return found_uuid_index;//返回找到的对应设备 } } -gs200_device_item_t* get_device_id(uint8_t UUID[6]){ - int index=get_device_index(UUID); - if(index > 0 && index < MAX_DEVICE_LIST_COUNT){ +gs200_device_item_t* get_device_by_index(uint8_t index){ + if(index >= 0 && index < MAX_DEVICE_LIST_COUNT){ return &devicelist[index]; }else{ return NULL; } } +gs200_device_item_t* get_device_by_uuid(uint8_t UUID[6]){ + int index=get_device_index(UUID); + return get_device_by_index(index); +} + + void print_device_type(int devicetype){ switch(devicetype) @@ -188,27 +196,34 @@ void dump_device(gs200_device_item_t* gs200_dev){ gs200_dev->uuid[1],gs200_dev->uuid[2],gs200_dev->uuid[3],gs200_dev->uuid[4], gs200_dev->uuid[5]); GS200_LOGD("src_addr %04X \r\n",gs200_dev->src_addr); - GS200_LOGD("target_addr %04X \r\n",gs200_dev->target_addr); GS200_LOGD("network_id %04X \r\n",gs200_dev->network_id); GS200_LOGD("group_id %04X \r\n",gs200_dev->group_id); GS200_LOGD("password %04X \r\n",gs200_dev->password); GS200_LOGD("software version %d.%d.%d \r\n",gs200_dev->version.MAJOR_VER,gs200_dev->version.MINOR_VER,gs200_dev->version.REVISION); GS200_LOGD("cycle_seconds %d \r\n",gs200_dev->cycle_seconds); GS200_LOGD("timestamp %ld \r\n",gs200_dev->utc_time_stamp); + GS200_LOGD("parent_serial_port %d \r\n",gs200_dev->parent_serial_port); GS200_LOGD("=======================================================\r\n"); } -void dump_all_device() +void dump_all_device_info() { for (int i = 0; i < MAX_DEVICE_LIST_COUNT ;i++) - { + { if (devicelist[i].src_addr > 0) { + GS200_LOGD("====device index %d============================\r\n",i); dump_device(&devicelist[i]); } } } +void dump_dongle_info() +{ + gs200_device_item_t *item_dongle=get_current_dongle_device(); + dump_device(item_dongle); +} + /** * 处理接收到的加密消息 */ @@ -219,21 +234,20 @@ static void handle_gs200_msg(gs200_msg_encrypted_t * msg) decode_gs200_msg(msg,&gs200_msg); print_hex_arr((uint8_t*)&gs200_msg,gs200_msg.size+2); print_cmd_type(gs200_msg.cmd_type); - + //dump_msg(&gs200_msg); switch(gs200_msg.cmd_type) { - case UART_CMD_CODE_RECV_REP: case UART_CMD_CODE_RECV: - GS200_LOGD("%s %d\r\n",__func__,__LINE__); + GS200_LOGD("%s %d opcode 0x%02X\r\n",__func__,__LINE__,gs200_msg.msg.nwk_frame.opcode); if(OPC_BEACON == gs200_msg.msg.nwk_frame.opcode ) { - gs200_device_item_t* item=get_device_id(gs200_msg.msg.nwk_frame.uuid); + gs200_device_item_t* item=get_device_by_uuid(gs200_msg.msg.nwk_frame.uuid); + gs200_device_item_t *item_dongle=get_current_dongle_device(); if(item != NULL) { item->snr = gs200_msg.msg.nwk_frame.snr; memcpy(item->uuid,gs200_msg.msg.nwk_frame.uuid,6); item->src_addr = gs200_msg.msg.nwk_frame.src_addr; - item->target_addr = gs200_msg.msg.nwk_frame.target_addr; item->network_id = gs200_msg.msg.nwk_frame.network_id; item->device_type = gs200_msg.msg.nwk_frame.frame_data.beacondata.device_type; memcpy(&item->version,&gs200_msg.msg.nwk_frame.frame_data.beacondata.version,sizeof(version_t)); @@ -241,44 +255,103 @@ static void handle_gs200_msg(gs200_msg_encrypted_t * msg) item->reomte_config = gs200_msg.msg.nwk_frame.frame_data.beacondata.hw_config.reomte_config; item->sensor_config = gs200_msg.msg.nwk_frame.frame_data.beacondata.hw_config.sensor_config; item->hw_version = gs200_msg.msg.nwk_frame.frame_data.beacondata.hw_version; - item->utc_time_stamp = get_timestamp(); + item->utc_time_stamp = get_timestamp();//更新消息接收时间,可以直接用来判断设备是否在线 + item->parent_serial_port = item_dongle->parent_serial_port; //当前设备只有一个串口,因此采用默认值,多个串口时,要进行区分。 + print_device_type(item->device_type); } - print_device_type(item->device_type); }else if (OPC_HEART_BEAT_STS == gs200_msg.msg.nwk_frame.opcode) { - gs200_device_item_t* item=get_device_id(gs200_msg.msg.nwk_frame.uuid); + gs200_device_item_t* item=get_device_by_uuid(gs200_msg.msg.nwk_frame.uuid); if(item != NULL) { item->device_type = gs200_msg.msg.nwk_frame.frame_data.heartbeat.device_type; item->utc_time_stamp = get_timestamp(); + print_device_type(item->device_type); + } + + }else if (OPC_HEART_BEAT_SETTING_STS == gs200_msg.msg.nwk_frame.opcode) + { + gs200_device_item_t* item=get_device_by_uuid(gs200_msg.msg.nwk_frame.uuid); + if(item != NULL) + { + switch(gs200_msg.msg.nwk_frame.frame_data.heartbeat_sts.dpid) + { + case 0x01: + + GS200_LOGD("heartbeat_switch %d\r\n",gs200_msg.msg.nwk_frame.frame_data.heartbeat_sts.heartbeat_set.heartbeat_switch); + break; + case 0x02: + { + int cycle = (gs200_msg.msg.nwk_frame.frame_data.heartbeat_sts.heartbeat_set.heartbeat_cycle >>1); + int unit = (gs200_msg.msg.nwk_frame.frame_data.heartbeat_sts.heartbeat_set.heartbeat_cycle & 0x01); + if( unit == 0 ) + item->cycle_seconds = cycle ; + else + item->cycle_seconds = cycle * 60; + + GS200_LOGD("heartbeat_cycle %d , unit %d , 0x%02X\r\n",cycle,unit,gs200_msg.msg.nwk_frame.frame_data.heartbeat_sts.heartbeat_set.heartbeat_cycle); + } + break; + } + + item->utc_time_stamp = get_timestamp(); + print_device_type(item->device_type); + } + + }else if (OPC_LAMP_SETTING_STS == gs200_msg.msg.nwk_frame.opcode) + { + gs200_device_item_t* item=get_device_by_uuid(gs200_msg.msg.nwk_frame.uuid); + if(item != NULL) + { + switch(gs200_msg.msg.nwk_frame.frame_data.lamp_sts.dpid) + { + case 0x12: //模式设置 0x00:传感器自动控 制,0x01:常灭,0x10:休眠,0x11:常亮 + + GS200_LOGD("lamp switch 0x%02X \r\n",gs200_msg.msg.nwk_frame.frame_data.lamp_sts.lamp_sts.lamp_mode); + break; + case 0x13: //1Byte,亮灯状态亮度,0-255 + + GS200_LOGD("lamp brightness %d \r\n",gs200_msg.msg.nwk_frame.frame_data.lamp_sts.lamp_sts.lamp_brightness); + break; + } + + item->utc_time_stamp = get_timestamp(); + print_device_type(item->device_type); + } + + }else if (OPC_HUMAN_PRESENCE_STS == gs200_msg.msg.nwk_frame.opcode) + { + gs200_device_item_t* item=get_device_by_uuid(gs200_msg.msg.nwk_frame.uuid); + if(item != NULL) + { + GS200_LOGD("OPC_HUMAN_PRESENCE_STS addr 0x%02X ",item->src_addr); + item->utc_time_stamp = get_timestamp(); + print_device_type(item->device_type); } - print_device_type(item->device_type); } break; case UART_CMD_CODE_GET_VER_REP: - case UART_CMD_CODE_GET_VER: { gs200_device_item_t *item=get_current_dongle_device(); memcpy(&item->version,&gs200_msg.msg.version,sizeof(version_t)); - dump_msg(&gs200_msg); - dump_device(item); + //dump_msg(&gs200_msg); + //dump_device(item); } break; case UART_CMD_CODE_GET_UID_REP: - case UART_CMD_CODE_GET_UID: { gs200_device_item_t *item=get_current_dongle_device(); memcpy(&item->uuid,&gs200_msg.msg.UUID,6); - dump_msg(&gs200_msg); - dump_device(item); + //dump_msg(&gs200_msg); + //dump_device(item); } break; - case UART_CMD_CODE_GET_NWK: + case UART_CMD_CODE_GET_NWK_REP: { gs200_device_item_t *item=get_current_dongle_device(); @@ -286,8 +359,8 @@ static void handle_gs200_msg(gs200_msg_encrypted_t * msg) item->password=gs200_msg.msg.network_setting.PASSWORD; item->src_addr=gs200_msg.msg.network_setting.UNICAST_ADDR; item->group_id=gs200_msg.msg.network_setting.GROUP_ADDR; - dump_msg(&gs200_msg); - dump_device(item); + //dump_msg(&gs200_msg); + //dump_device(item); } break; diff --git a/src/utils.c b/src/utils.c index 2e62018..b990583 100644 --- a/src/utils.c +++ b/src/utils.c @@ -24,10 +24,11 @@ void print_hex_arr(uint8_t *buf, int len) { if (len <= 0) return; - // GS200_LOGD("0x"); + GS200_LOGD("%d --- ",get_timestamp()); for (int i = 0; i < len; i++) { - GS200_LOGD("0x%02X,", buf[i]); + //GS200_LOGD("0x%02X,", buf[i]); + GS200_LOGD("%02X ", buf[i]); } GS200_LOGD("\r\n"); } diff --git a/src/utils.h b/src/utils.h index 0b1a31a..1a14431 100644 --- a/src/utils.h +++ b/src/utils.h @@ -27,7 +27,8 @@ int g_server_main(uint8_t *path); int g_send_msg(gs200_msg_encrypted_t *gs200_msg_encrypted_out); int g_set_udp_mode(uint8_t enUdp); gs200_device_item_t* get_current_dongle_device(); - +gs200_device_item_t* get_device_by_index(uint8_t index); +gs200_device_item_t* get_device_by_uuid(uint8_t UUID[6]); uint64_t get_timestamp(); #endif //__UTILS_H__ \ No newline at end of file diff --git a/src/utils_shell_cmd.c b/src/utils_shell_cmd.c index dcaf118..bab6d4f 100644 --- a/src/utils_shell_cmd.c +++ b/src/utils_shell_cmd.c @@ -27,12 +27,13 @@ typedef enum{ AT_CMD_LIST_DEVICE, /* 打印已知列表 */ AT_CMD_GET_DONGLE_INFO, /* 获取当前dongle详细信息 */ AT_CMD_SET_HEARTBEAT_CYCLE, /* 设置连接间隔 */ - + AT_CMD_LAMP_PWRON, /* 设置灯开 */ + AT_CMD_LAMP_PWROFF, /* 设置灯关 */ + AT_CMD_LAMP_BRIGHTNESS, /* 设置灯亮度 */ AT_END }AT_Cmd; - /* 指令执行函数 */ unsigned char at_cmd_test(unsigned char *p, unsigned char len){ @@ -48,15 +49,17 @@ unsigned char at_cmd_scan(unsigned char *p, unsigned char len){ GS200_LOGD("OK\r\n"); gs200_msg_encrypted_t gs200_msg_encrypted_out={0}; gs200_device_item_t* item=get_current_dongle_device(); - gen_gs200_msg_start_scan(item->network_id,item->src_addr,0xFFFF,item->uuid,1,&gs200_msg_encrypted_out); + uint8_t uuid[6]={0}; + gen_gs200_msg_start_scan(2,item->network_id,item->src_addr,ADDRESS_TYPE_BROADCAST_ADDR,uuid,&gs200_msg_encrypted_out); g_send_msg(&gs200_msg_encrypted_out); + }else { GS200_LOGD("OK\r\n"); gs200_msg_encrypted_t gs200_msg_encrypted_out={0}; gs200_device_item_t* item=get_current_dongle_device(); - gen_gs200_msg_stop_scan(item->network_id,item->src_addr,0xFFFF,item->uuid,&gs200_msg_encrypted_out); + gen_gs200_msg_stop_scan(item->network_id,item->src_addr,ADDRESS_TYPE_BROADCAST_ADDR,item->uuid,&gs200_msg_encrypted_out); g_send_msg(&gs200_msg_encrypted_out); } return 0; @@ -66,13 +69,13 @@ unsigned char at_cmd_getdevinfo(unsigned char *p, unsigned char len){ GS200_LOGD("OK\r\n"); - + dump_dongle_info(); return 0; } unsigned char at_cmd_listdevices(unsigned char *p, unsigned char len){ GS200_LOGD("OK\r\n"); - dump_all_device(); + dump_all_device_info(); return 0; } @@ -95,10 +98,68 @@ unsigned char at_cmd_get_dongleinfo(unsigned char *p, unsigned char len){ unsigned char at_cmd_set_heartcycle(unsigned char *p, unsigned char len){ + + gs200_msg_encrypted_t gs200_msg_encrypted_out={0}; + gs200_device_item_t* item=get_current_dongle_device(); + int16_t cycle = -1; + int16_t index = -1; + sscanf(p,"%d,%d",&index,&cycle); + gs200_device_item_t* item_target=get_device_by_index(index); + if(item_target != NULL && cycle > -1){ + // GS200_LOGD("== index %d cycle %d\r\n",index,cycle); + gen_gs200_msg_heartbeat_cycle(cycle,item_target->network_id,item->src_addr,item_target->src_addr,item->uuid,&gs200_msg_encrypted_out); + g_send_msg(&gs200_msg_encrypted_out); + } + + return 0; +} +unsigned char at_cmd_set_lamp_poweron(unsigned char *p, unsigned char len){ + + GS200_LOGD("OK\r\n"); + gs200_msg_encrypted_t gs200_msg_encrypted_out={0}; + gs200_device_item_t* item=get_current_dongle_device(); + + int16_t index = -1; + sscanf(p,"%d",&index); + gs200_device_item_t* item_target=get_device_by_index(index); + if(item_target != NULL){ + gen_gs200_msg_lamp_power(1,item_target->network_id,item->src_addr,item_target->src_addr,item->uuid,&gs200_msg_encrypted_out); + g_send_msg(&gs200_msg_encrypted_out); + } + return 0; +} + +unsigned char at_cmd_set_lamp_poweroff(unsigned char *p, unsigned char len){ + GS200_LOGD("OK\r\n"); + gs200_msg_encrypted_t gs200_msg_encrypted_out={0}; + gs200_device_item_t* item=get_current_dongle_device(); + + int16_t index = -1; + sscanf(p,"%d",&index); + gs200_device_item_t* item_target=get_device_by_index(index); + if(item_target != NULL){ + gen_gs200_msg_lamp_power(0,item_target->network_id,item->src_addr,item_target->src_addr,item->uuid,&gs200_msg_encrypted_out); + g_send_msg(&gs200_msg_encrypted_out); + } return 0; } +unsigned char at_cmd_set_lamp_brightness(unsigned char *p, unsigned char len){ + + GS200_LOGD("OK\r\n"); + gs200_msg_encrypted_t gs200_msg_encrypted_out={0}; + gs200_device_item_t* item=get_current_dongle_device(); + int16_t brightness = -1; + int16_t index = -1; + sscanf(p,"%d,%d",&index,&brightness); + gs200_device_item_t* item_target=get_device_by_index(index); + if(item_target != NULL && brightness > -1){ + gen_gs200_msg_lamp_brightness(brightness,item_target->network_id,item->src_addr,item_target->src_addr,item->uuid,&gs200_msg_encrypted_out); + g_send_msg(&gs200_msg_encrypted_out); + } + return 0; +} typedef unsigned char (*pFunc)(unsigned char *ptr, unsigned char len); typedef struct { @@ -113,10 +174,14 @@ const AT_cmd_func at_cmd_func[] = { {AT_CMD_TEST, "AT", at_cmd_test,"AT"}, {AT_CMD_HELP, "AT+HELP", at_cmd_help,"AT+HELP"}, {AT_CMD_SCAN, "AT+SCAN=", at_cmd_scan,"AT+SCAN=1 start scan , AT+SCAN=0 stop scan"}, - {AT_CMD_GET_DEVINFO, "AT+GET_DEVINFO=", at_cmd_getdevinfo,"AT+GET_DEVICEINFO=12348 [uint16_t device_addr]"}, + // {AT_CMD_GET_DEVINFO, "AT+GET_DEVINFO=", at_cmd_getdevinfo,"AT+GET_DEVICEINFO=12348 [uint16_t device_addr]"}, + {AT_CMD_GET_DEVINFO, "AT+DUMP_DONGLEINFO", at_cmd_getdevinfo,"AT+DUMP_DONGLEINFO"}, {AT_CMD_LIST_DEVICE, "AT+LIST_DEVICES", at_cmd_listdevices,"AT+LIST_DEVICES"}, {AT_CMD_GET_DONGLE_INFO, "AT+GET_DONGLEINFO", at_cmd_get_dongleinfo,"AT+GET_DONGLEINFO"}, - {AT_CMD_SET_HEARTBEAT_CYCLE, "AT+SETHEARTBEATCYCLE=", at_cmd_set_heartcycle,"AT+SETHEARTBEATCYCLE=60 , 60seconds send one heartbeat message"}, + {AT_CMD_SET_HEARTBEAT_CYCLE, "AT+SETHEARTBEATCYCLE=", at_cmd_set_heartcycle,"AT+SETHEARTBEATCYCLE=0,60 , device index in LIST_DEVICES and 60seconds send one heartbeat message"}, + {AT_CMD_LAMP_PWRON, "AT+LAMP_POWERON=", at_cmd_set_lamp_poweron,"AT+LAMP_POWERON=0 , device index in LIST_DEVICES "}, + {AT_CMD_LAMP_PWROFF, "AT+LAMP_POWEROFF=", at_cmd_set_lamp_poweroff,"AT+LAMP_POWEROFF=0 , device index in LIST_DEVICES "}, + {AT_CMD_LAMP_BRIGHTNESS, "AT+LAMP_BRIGHTNESS=", at_cmd_set_lamp_brightness,"AT+LAMP_BRIGHTNESS=0,255 , device index in LIST_DEVICES and 0~255 brightness"}, {AT_END, NULL, NULL} }; @@ -129,6 +194,7 @@ unsigned char at_cmd_help(unsigned char *p, unsigned char len){ GS200_LOGD("OK\r\n"); return 0; } + /* 查找指令表中对应的指令 */ unsigned char AT_cmd_search(unsigned char *p, unsigned char len){ -- 2.17.1