当前位置: 首页 > news >正文

购物网站建设源码福建省建设执业注册中心网站

购物网站建设源码,福建省建设执业注册中心网站,高级网页设计教程,好好建站一、前言 最近拿着蓝牙自拍杆出去拍照时#xff0c;突然想了解下其中的原理#xff0c;写下了自己的学习过程#xff0c;本文测试平台为瑞昱8762C。 二、蓝牙自拍杆 1、蓝牙自拍杆实现拍照的原理 手机在拍照模式下按音量调节键就可以触发快门按下拍照#xff0c;蓝牙自拍杆…一、前言 最近拿着蓝牙自拍杆出去拍照时突然想了解下其中的原理写下了自己的学习过程本文测试平台为瑞昱8762C。 二、蓝牙自拍杆 1、蓝牙自拍杆实现拍照的原理 手机在拍照模式下按音量调节键就可以触发快门按下拍照蓝牙自拍杆的原理也是通过模拟音量键触发从而实现远程控制拍照。 2、蓝牙自拍杆的蓝牙服务 首先用nrf connect看下手上的蓝牙自拍杆的广播包和服务是怎么样的如下 广播 服务 即对于HID设备广播包数据中需要有HID设备的服务UUID0x1812和设备外观0x03C1Keyboard。 服务中需要有Human Interface Device服务和Battery Service服务。蓝牙自拍杆通过Report特性Notify数据到手机。 同时还注意到连接上蓝牙自拍杆后手机需要能够与蓝牙自拍杆进行连接和绑定并且在连接后自拍杆的蓝牙广播消失即功能上只能被一个设备连接。  3、代码实现 SDK目录sdk\inc\bluetooth\profile\server下有好几个HID设备的例程可以直接套用其实像是 广播和服务这些都没什么可讲的是定好的标准。就是关于 hid report map部分可以讲讲HID设备被连接上后HOST会获取hid report map来确定这个设备具有哪些功能比如每次上报数据有几个字节有什么按键每个按键对应上报数据的哪个字节和实现什么功能等等。所以重点就是了解hid report map下面附上一张自己用“HID Descriptor tool”工具保存为.h文件生成的hid report map // 蓝牙自拍杆 static const uint8_t hids_report_descriptor[] {     // Report ID 1: Advanced buttons     0x05, 0x0C,         // Usage Page (Consumer)     0x09, 0x01,         // Usage (Consumer Control)     0xA1, 0x01,         // Collection (Application)     0x85, 0x01,         //      Report Id (1)     0x15, 0x00,         //      Logical minimum (0)     0x25, 0x01,         //      Logical maximum (1)     0x75, 0x01,         //      Report Size (1)     0x95, 0x01,         //      Report Count (1)     0x09, 0x94,         //      (Quit)     0x81, 0x06,         //      Input (Data,Value,Relative,Bit Field)     0x09, 0x95,         //      (Help)     0x81, 0x06,         //      Input (Data,Value,Relative,Bit Field)     0x09, 0xEA,         //      (Volume Down)     0x81, 0x06,         //      Input (Data,Value,Relative,Bit Field)     0x09, 0xE9,         //      (Volume Up)     0x81, 0x06,         //      Input (Data,Value,Relative,Bit Field)     0x09, 0xCB,         //      (Tracking Decrement)     0x81, 0x06,         //      Input (Data,Value,Relative,Bit Field)     0x09, 0xCA,         //      (tracking Increment)     0x81, 0x06,         //      Input (Data,Value,Relative,Bit Field)     0x09, 0xB6,         //      (Scan Previous Track)     0x81, 0x06,         //      Input (Data,Value,Relative,Bit Field)     0x09, 0xB5,         //      (Scan Next Track)     0x81, 0x06,         //      Input (Data,Value,Relative,Bit Field)     0x09, 0xB1,         //      (Pause)     0x81, 0x06,         //      Input (Data,Value,Relative,Bit Field)     0x09, 0xB0,         //      (Play)     0x81, 0x06,         //      Input (Data,Value,Relative,Bit Field)     0x75, 0x01,         //      Report Size (1)     0x95, 0x06,         //      Report Count (6)     0x81, 0x07,         //      Input (Data,Value,Relative,Bit Field)     0xC0                // End Collection }; hid report map具体的了解可以参考文章USB HID报告描述符教程 - 知乎但是建议再粗略读下手册《Device Class Definition for Human Interface Devices (HID)》会有更好的理解这个手册里有讲hid report map的解析机制。 根据自定义的hid report map每次上报需要有两个字节每个bit的含义如下表 bit位置功能bit 0Quitbit 1Helpbit 2Volume Downbit 3Volume Upbit 4Tracking Decrementbit 5Tracking Incrementbit 6Scan Previous Trackbit 7Scan Next Trackbit 8Pausebit 9Playbit 10~15Reserve 以触发Volume Up为例上报数据 0x80 0x00按下后再上报数据0x00 0x00松开就可以表示一次音量键按下和松开的过程在手机相机模式下实现了单次拍照。 当然也可以用电脑蓝牙连接也可以控制电脑的音量Pause 和 Play可以在电脑上控制视频播放器的暂停和开始更多的按键功能大家可以自己探索。 uint8_t rptData[2] {0}; bool ret;rptData[0] 0x08; rptData[1] 0x00; ret hids_send_report(0, hids_srv_id, GATT_SRV_HID_KB_INPUT_INDEX, rptData, 2);os_delay(200);rptData[0] 0x00; rptData[1] 0x00; ret hids_send_report(0, hids_srv_id, GATT_SRV_HID_KB_INPUT_INDEX, rptData, 2); 三、蓝牙键盘 1、代码实现 hid report map如下 // 键盘 static const uint8_t hids_report_descriptor[] {     0x05, 0x01,      // USAGE_PAGE (Generic Desktop)     0x09, 0x06,      // USAGE (Keyboard)     0xa1, 0x01,      // COLLECTION (Application)     0x85, 0x01,      //     REPORT_ID (1)     0x75, 0x01,      //     Report Size (1)     0x95, 0x08,      //     Report Count (8)     0x05, 0x07,      //     Usage Page (Key Codes)     0x19, 0xE0,      //     Usage Minimum (224)     0x29, 0xE7,      //     Usage Maximum (231)     0x15, 0x00,      //     Logical Minimum (0)     0x25, 0x01,      //     Logical Maximum (1)     0x81, 0x02,      //     Input (Data, Variable, Absolute); Modifier byte     0x95, 0x01,      //     Report Count (1)     0x75, 0x08,      //     Report Size (8)     0x81, 0x01,      //     Input (Constant); Reserved byte     0x95, 0x05,      //     Report Count (5)     0x75, 0x01,      //     Report Size (1)     0x05, 0x08,      //     Usage Page (LEDs)     0x19, 0x01,      //     Usage Minimum (1)     0x29, 0x05,      //     Usage Maximum (5)     0x91, 0x02,      //     Output (Data, Variable, Absolute); LED report     0x95, 0x01,      //     Report Count (1)     0x75, 0x03,      //     Report Size (3)     0x91, 0x01,      //     Output (Constant); LED report padding     0x95, 0x06,      //     Report Count (6)     0x75, 0x08,      //     Report Size (8)     0x15, 0x00,      //     Logical Minimum (0)     0x25, 0x65,      //     Logical Maximum (101)     0x05, 0x07,      //     Usage Page (Key Codes)     0x19, 0x00,      //     Usage Minimum (0)     0x29, 0x65,      //     Usage Maximum (101)     0x81, 0x00,      //     Input (Data, Array); Key array (6 bytes)     0xc0             // END_COLLECTION } 第一个字节表示8个特殊的按键第二个字节保留后面6个字节的每个字节都可以表示一个按键的状态可以同时有多个按键按下。 这里有个问题hid report map中指示224到231号键由第一个字节表示0到101号键由最后6个字节的任意一个字节表示那么这些键的号码和实际上的按键是怎么样的对应关系呢可以在手册《HID Usage Tables FOR Universal Serial Bus (USB)》中找到这样的对应关系表粘贴一段如下  我们要上报的键号是这份表中的Usage ID这个Usage ID和USB 键盘通信中上报的那个Keycode值是不一样的东西。 当上报0x00 0x00 0x04 0x00 0x00 0x00 0x00 0x00时就相当于按下“A”键当上报0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x00时就相当于按下“win”键。 连接电脑和手机都可以使用我用的小米手机蓝牙键盘连上之后会默认关闭屏幕键盘需要设置同时支持屏幕键盘在输入文字界面才会有屏幕键盘跳出来。 上面是标准的键盘当然我们也可以自定义键盘比如只有三个按键Ctrl、C和V。hid report map如下 // 自定义键盘 static const uint8_t hids_report_descriptor[] {     0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)     0x09, 0x06,                    // USAGE (Keyboard)     0xa1, 0x01,                    // COLLECTION (Application)     0x85, 0x01,                    //   REPORT_ID (1)     0x75, 0x01,                    //   REPORT_SIZE (1)     0x95, 0x01,                    //   REPORT_COUNT (1)     0x15, 0x00,                    //   LOGICAL_MINIMUM (0)     0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)     0x05, 0x07,                    //   USAGE_PAGE (Keyboard)     0x09, 0xe0,                    //   USAGE (Keyboard LeftControl)     0x81, 0x06,                    //   INPUT (Data,Var,Rel)     0x09, 0x06,                    //   USAGE (Keyboard c and C)     0x81, 0x06,                    //   INPUT (Data,Var,Rel)     0x09, 0x19,                    //   USAGE (Keyboard v and V)     0x81, 0x06,                    //   INPUT (Data,Var,Rel)     0x95, 0x01,                    //   REPORT_COUNT (1)     0x75, 0x05,                    //   REPORT_SIZE (5)     0x81, 0x07,                    //   INPUT (Cnst,Var,Rel)                         0xc0,                          // END_COLLECTION }; bit 0代表“Ctrl”键bit 1代表“C”键bit 2代表“V”键bit 3~7预留。 当我们上报0x03时代表按下Ctrl C复制上报0x05时代表按下Ctrl V粘贴。 四、蓝牙鼠标 1、代码实现 hid report map如下 // 鼠标 static const uint8_t hids_report_descriptor[] {     0x05, 0x01,   // USAGE_PAGE (Generic Desktop)     0x09, 0x02,   // USAGE (Mouse)     0xa1, 0x01,   // COLLECTION (Application)     0x85, 0x01,   //   REPORT_ID (1)     0x09, 0x01,   //   USAGE (Pointer)     0xa1, 0x00,   //   COLLECTION (Physical)     0x05, 0x09,   //         Usage Page (Buttons)     0x19, 0x01,   //         Usage Minimum (1)     0x29, 0x03,   //         Usage Maximum (3)     0x15, 0x00,   //         Logical Minimum (0)     0x25, 0x01,   //         Logical Maximum (1)     0x95, 0x03,   //         Report Count (3)     0x75, 0x01,   //         Report Size (1)     0x81, 0x02,   //         Input(Data, Variable, Absolute); 3 button bits     0x95, 0x01,   //         Report Count(1)     0x75, 0x05,   //         Report Size(5)     0x81, 0x03,   //         Input(Constant);                 5 bit padding     0x05, 0x01,   //         Usage Page (Generic Desktop)     0x09, 0x30,   //         Usage (X)     0x09, 0x31,   //         Usage (Y)     0x09, 0x38,   //         Usage (Wheel)     0x15, 0x81,   //         Logical Minimum (-127)     0x25, 0x7F,   //         Logical Maximum (127)     0x75, 0x08,   //         Report Size (8)     0x95, 0x03,   //         Report Count (3)     0x81, 0x06,   //         Input(Data, Variable, Relative); 3 position bytes (X,Y,Wheel)     0xc0,         //   END_COLLECTION     0xc0          // END_COLLECTION }; 上报有4个字节bit 0 鼠标左键bit 1鼠标右键bit 2鼠标中键第二字节鼠标X轴移动第三字节鼠标Y轴移动第四字节滚轮移动。 注意在调试的时候hid report map变了要重新和设备绑定不然会发现代码改了测试时却不生效。广播包的设备外观0x03C1keyboard记得改成0x03C2mouse这样就可以看到键盘图标变成了鼠标的图标。 五、复合设备 1、代码实现 也可以像USB插线的设备一样做成复合设备把键盘和鼠标两个设备复合在一起这样连接一个蓝牙设备就相当于同时连接了一个蓝牙键盘和一个蓝牙鼠标。 hid report map如下 #define HIDS_KB_REPORT_ID                      1 #if FEATURE_SUPPORT_MULTIMEDIA_KEYBOARD #define HIDS_MM_KB_REPORT_ID                   2 #endif // 复合设备 static const uint8_t hids_report_descriptor[] {     0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)     0x09, 0x06,                    // USAGE (Keyboard)     0xa1, 0x01,                    // COLLECTION (Application)     0x85, HIDS_KB_REPORT_ID,                    //   REPORT_ID (1)     0x75, 0x01,                    //   REPORT_SIZE (1)     0x95, 0x01,                    //   REPORT_COUNT (1)     0x15, 0x00,                    //   LOGICAL_MINIMUM (0)     0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)     0x05, 0x07,                    //   USAGE_PAGE (Keyboard)     0x09, 0xe0,                    //   USAGE (Keyboard LeftControl)     0x81, 0x06,                    //   INPUT (Data,Var,Rel)     0x09, 0x06,                    //   USAGE (Keyboard c and C)     0x81, 0x06,                    //   INPUT (Data,Var,Rel)     0x09, 0x19,                    //   USAGE (Keyboard v and V)     0x81, 0x06,                    //   INPUT (Data,Var,Rel)     0x95, 0x01,                    //   REPORT_COUNT (1)     0x75, 0x05,                    //   REPORT_SIZE (5)     0x81, 0x07,                    //   INPUT (Cnst,Var,Rel)                         0xc0,                          // END_COLLECTION #if FEATURE_SUPPORT_MULTIMEDIA_KEYBOARD     0x05, 0x01,   // USAGE_PAGE (Generic Desktop)     0x09, 0x02,   // USAGE (Mouse)     0xa1, 0x01,   // COLLECTION (Application)     0x85, HIDS_MM_KB_REPORT_ID,   //   REPORT_ID (2)     0x09, 0x01,   //   USAGE (Pointer)     0xa1, 0x00,   //   COLLECTION (Physical)     0x05, 0x09,   //         Usage Page (Buttons)     0x19, 0x01,   //         Usage Minimum (1)     0x29, 0x03,   //         Usage Maximum (3)     0x15, 0x00,   //         Logical Minimum (0)     0x25, 0x01,   //         Logical Maximum (1)     0x95, 0x03,   //         Report Count (3)     0x75, 0x01,   //         Report Size (1)     0x81, 0x02,   //         Input(Data, Variable, Absolute); 3 button bits     0x95, 0x01,   //         Report Count(1)     0x75, 0x05,   //         Report Size(5)     0x81, 0x03,   //         Input(Constant);                 5 bit padding     0x05, 0x01,   //         Usage Page (Generic Desktop)     0x09, 0x30,   //         Usage (X)     0x09, 0x31,   //         Usage (Y)     0x09, 0x38,   //         Usage (Wheel)     0x15, 0x81,   //         Logical Minimum (-127)     0x25, 0x7F,   //         Logical Maximum (127)     0x75, 0x08,   //         Report Size (8)     0x95, 0x03,   //         Report Count (3)     0x81, 0x06,   //         Input(Data, Variable, Relative); 3 position bytes (X,Y,Wheel)     0xc0,         //   END_COLLECTION     0xc0          // END_COLLECTION #endif }; 复合设备就是简单的把前面自定义键盘和鼠标两部分的report map拼在了一起。注意更改广播包中的外观属性为0x03C0HID这样连上电脑时可以显示出键盘和鼠标复合在一起的图标如果不改的话实测对功能也没影响。 对于两个或以上的HID复合设备来说是要在上报数据前加一个字节的report ID的在这里键盘的report ID是1鼠标的report ID是2。那么上报0x01 0x02代表按下字母“C”键上报0x02 0x02 0x00 0x00 0x00代表按下鼠标右键。 对于瑞昱8762C平台而言在实际调试过程中发现这样发送数据不生效需要打开宏“FEATURE_SUPPORT_MULTIMEDIA_KEYBOARD”即在Human Interface Device服务下再创建一个report特性给report ID为2的鼠标上报数据用这两个report特性的特征值ID是一样的用nrf connect看的话只能看到一个report点。由于不同的设备数据通过不同的特征值上报给HOST所以在瑞昱8762C这里上报的数据前不用加report ID。目前手里没有抓包工具验证是否平台在后续的内部处理过程中加上了这个report ID。 六、部分测试代码逻辑 我的调试过程是在Human Interface Device服务外额外创建一个调试的服务来接收调试命令实际上就是我要上报给HOST的数据先写入调试命令然后开发板再将命令转交给HOST。 void cmd_process(uint8_t *cmdBuf, uint8_t len) { #if FEATURE_SUPPORT_MULTIMEDIA_KEYBOARDbool ret;// 首先区分发给谁if (cmdBuf[0] HIDS_KB_REPORT_ID){ret hids_send_report(0, hids_srv_id, GATT_SRV_HID_KB_INPUT_INDEX, cmdBuf 1, len - 1);os_delay(200);// 按键松开memset(cmdBuf, 0, len);ret hids_send_report(0, hids_srv_id, GATT_SRV_HID_KB_INPUT_INDEX, cmdBuf 1, len - 1);}else{ret hids_send_report(0, hids_srv_id, GATT_SRV_HID_MM_KB_INPUT_INDEX, cmdBuf 1, len - 1);os_delay(200);// 按键松开memset(cmdBuf, 0, len);ret hids_send_report(0, hids_srv_id, GATT_SRV_HID_MM_KB_INPUT_INDEX, cmdBuf 1, len - 1);}myprintf([%s] ret %d\r\n, __func__, ret); #elsebool ret;ret hids_send_report(0, hids_srv_id, GATT_SRV_HID_KB_INPUT_INDEX, cmdBuf, len);os_delay(200);memset(cmdBuf, 0, len);ret hids_send_report(0, hids_srv_id, GATT_SRV_HID_KB_INPUT_INDEX, cmdBuf, len);myprintf([%s] ret %d\r\n, __func__, ret); #endif } 在复合设备的调试中通过调试命令中的report ID区分从哪个report特性点上报数据给HOST。 七、参考资料 【低功耗蓝牙】⑤ HID协议 - 哔哩哔哩 USB HID报告描述符教程 - 知乎 《Universal Serial Bus (USB)_Device Class Definition .pdf》 《HID Usage Tables FOR Universal Serial Bus (USB).pdf》 《HID Descriptor tool.zip》 《hids_rtl8762c.rar》hid设备调试demo仅供参考 链接https://pan.baidu.com/s/1UVz56o377uD3OTKnO5P5kg  提取码hqus   
文章转载自:
http://www.morning.xdjsx.cn.gov.cn.xdjsx.cn
http://www.morning.qnxtz.cn.gov.cn.qnxtz.cn
http://www.morning.wdhzk.cn.gov.cn.wdhzk.cn
http://www.morning.zqmdn.cn.gov.cn.zqmdn.cn
http://www.morning.xlbtz.cn.gov.cn.xlbtz.cn
http://www.morning.fbmzm.cn.gov.cn.fbmzm.cn
http://www.morning.jkmjm.cn.gov.cn.jkmjm.cn
http://www.morning.hffjj.cn.gov.cn.hffjj.cn
http://www.morning.shinezoneserver.com.gov.cn.shinezoneserver.com
http://www.morning.lmmh.cn.gov.cn.lmmh.cn
http://www.morning.dmzfz.cn.gov.cn.dmzfz.cn
http://www.morning.kljhr.cn.gov.cn.kljhr.cn
http://www.morning.nxhjg.cn.gov.cn.nxhjg.cn
http://www.morning.shnqh.cn.gov.cn.shnqh.cn
http://www.morning.gydth.cn.gov.cn.gydth.cn
http://www.morning.nlgyq.cn.gov.cn.nlgyq.cn
http://www.morning.wypyl.cn.gov.cn.wypyl.cn
http://www.morning.yybcx.cn.gov.cn.yybcx.cn
http://www.morning.hwycs.cn.gov.cn.hwycs.cn
http://www.morning.mnccq.cn.gov.cn.mnccq.cn
http://www.morning.fjzlh.cn.gov.cn.fjzlh.cn
http://www.morning.bpkqd.cn.gov.cn.bpkqd.cn
http://www.morning.dtmjn.cn.gov.cn.dtmjn.cn
http://www.morning.kqgqy.cn.gov.cn.kqgqy.cn
http://www.morning.wmhqd.cn.gov.cn.wmhqd.cn
http://www.morning.wcrcy.cn.gov.cn.wcrcy.cn
http://www.morning.tftw.cn.gov.cn.tftw.cn
http://www.morning.rltw.cn.gov.cn.rltw.cn
http://www.morning.rcwzf.cn.gov.cn.rcwzf.cn
http://www.morning.ltdrz.cn.gov.cn.ltdrz.cn
http://www.morning.krzrg.cn.gov.cn.krzrg.cn
http://www.morning.mswkd.cn.gov.cn.mswkd.cn
http://www.morning.hwnnh.cn.gov.cn.hwnnh.cn
http://www.morning.pmnn.cn.gov.cn.pmnn.cn
http://www.morning.jydhl.cn.gov.cn.jydhl.cn
http://www.morning.yngtl.cn.gov.cn.yngtl.cn
http://www.morning.fldrg.cn.gov.cn.fldrg.cn
http://www.morning.plhyc.cn.gov.cn.plhyc.cn
http://www.morning.skdrp.cn.gov.cn.skdrp.cn
http://www.morning.brqjs.cn.gov.cn.brqjs.cn
http://www.morning.fgsct.cn.gov.cn.fgsct.cn
http://www.morning.rmyqj.cn.gov.cn.rmyqj.cn
http://www.morning.grpbt.cn.gov.cn.grpbt.cn
http://www.morning.tdfyj.cn.gov.cn.tdfyj.cn
http://www.morning.trmpj.cn.gov.cn.trmpj.cn
http://www.morning.klcdt.cn.gov.cn.klcdt.cn
http://www.morning.mzydm.cn.gov.cn.mzydm.cn
http://www.morning.qkdcb.cn.gov.cn.qkdcb.cn
http://www.morning.npmpn.cn.gov.cn.npmpn.cn
http://www.morning.cpfx.cn.gov.cn.cpfx.cn
http://www.morning.lpcpb.cn.gov.cn.lpcpb.cn
http://www.morning.ryxgk.cn.gov.cn.ryxgk.cn
http://www.morning.nytgk.cn.gov.cn.nytgk.cn
http://www.morning.lxlzm.cn.gov.cn.lxlzm.cn
http://www.morning.bmtyn.cn.gov.cn.bmtyn.cn
http://www.morning.dnphd.cn.gov.cn.dnphd.cn
http://www.morning.bzlfw.cn.gov.cn.bzlfw.cn
http://www.morning.fkyrk.cn.gov.cn.fkyrk.cn
http://www.morning.kpqjr.cn.gov.cn.kpqjr.cn
http://www.morning.zwhtr.cn.gov.cn.zwhtr.cn
http://www.morning.rrcrs.cn.gov.cn.rrcrs.cn
http://www.morning.pndhh.cn.gov.cn.pndhh.cn
http://www.morning.ysbrz.cn.gov.cn.ysbrz.cn
http://www.morning.xqgtd.cn.gov.cn.xqgtd.cn
http://www.morning.xhpnp.cn.gov.cn.xhpnp.cn
http://www.morning.psgbk.cn.gov.cn.psgbk.cn
http://www.morning.swyr.cn.gov.cn.swyr.cn
http://www.morning.lfpzs.cn.gov.cn.lfpzs.cn
http://www.morning.fnzbx.cn.gov.cn.fnzbx.cn
http://www.morning.wtyqs.cn.gov.cn.wtyqs.cn
http://www.morning.yfcyh.cn.gov.cn.yfcyh.cn
http://www.morning.rtbx.cn.gov.cn.rtbx.cn
http://www.morning.phwmj.cn.gov.cn.phwmj.cn
http://www.morning.njfgl.cn.gov.cn.njfgl.cn
http://www.morning.wnkqt.cn.gov.cn.wnkqt.cn
http://www.morning.yyzgl.cn.gov.cn.yyzgl.cn
http://www.morning.rnwmp.cn.gov.cn.rnwmp.cn
http://www.morning.brnwc.cn.gov.cn.brnwc.cn
http://www.morning.tknqr.cn.gov.cn.tknqr.cn
http://www.morning.cytr.cn.gov.cn.cytr.cn
http://www.tj-hxxt.cn/news/244658.html

相关文章:

  • 百度推广必须做手机网站吗网站开发毕业设计任务书范文
  • 烟台免费网站建站模板网站双线主机优势
  • 帮客户做网站的公司武穴建设网站
  • 网站建设 主机选择专业做淘宝网站推广
  • 中国纪检监察网站首页找网站推广
  • 域名备案网站建设方案书网站备案贵州电话
  • 餐饮网站欣赏影楼后期修图培训学校
  • 东莞网站设计建设阳东区网络问政平台
  • 网站资料要提供哪些成都建设网页公司
  • 上海网站排名优化怎么做网站建设与维护实训
  • 招聘网站哪个平台比较好免费申请qq邮箱
  • 建立网站需要什么硬件爱尚网站建设
  • 网站设计模板旅游景点11页唐河永琚建筑公司网站
  • 手机建网站免费域名空间wordpress 笑话站
  • 哪个地方旅游网站做的比较好怎么用h5做网站
  • 做什爱网站wordpress数据库改主机
  • 会计信息网站建设的意思wordpress流主题
  • 网站建设淘宝工信部网站备案查询官网
  • 免费浏览的网站北京网页设计公司兴田德润团队
  • 怎么确定网站关键词免费网站建设能做吗
  • 上海服装网站建设网站开发的硬件环境要求
  • 三五互联网站网站开发与应用 大作业作业
  • 怎样做网站背景花都建设局网站
  • 广州市专业网站建设html5手机网站开发教程
  • 临沂网站建设对实体企业的重要性网站建设是固定资产吗
  • 设计高端网站哪家好三网合一网站开源
  • 英文网站seo方案中国站长之家爱站网
  • 汕头哪里建网站个人怎么开网上超市
  • 做运营必看的网站要怎么制作网站
  • 好的高端网站商标注册网上查询