From 02cd6d8edff80e1b970f4d42fdd7eabeffeae9ce Mon Sep 17 00:00:00 2001 From: sevenhhe Date: Mon, 4 Jan 2021 07:37:26 +0800 Subject: [PATCH 0001/1411] =?UTF-8?q?Video=20=E6=9C=89=E7=BA=BF=E9=85=8D?= =?UTF-8?q?=E7=BD=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://cloud.tencent.com/document/product/1131/42246 Change-Id: I8dd9fb1c217117e722b3774d2c290370b313b3c5 --- .../core/link/configNetwork/TIoTCoreUtil.kt | 81 ++++++++++++++++++- .../link/core/link/configNetwork/UdpData.kt | 8 ++ .../core/link/configNetwork/WiredConfig.kt | 7 ++ .../core/link/listener/WiredConfigListener.kt | 13 +++ sdkdemo/src/main/AndroidManifest.xml | 1 + .../core/demo/activity/ConfigNetActivity.kt | 4 + .../demo/activity/WiredConfigNetActivity.kt | 65 +++++++++++++++ .../res/layout/activity_config_net_type.xml | 10 +++ .../res/layout/activity_wired_config_net.xml | 43 ++++++++++ 9 files changed, 231 insertions(+), 1 deletion(-) create mode 100644 sdk/explorer-link-android/src/main/java/com/tencent/iot/explorer/link/core/link/configNetwork/UdpData.kt create mode 100644 sdk/explorer-link-android/src/main/java/com/tencent/iot/explorer/link/core/link/configNetwork/WiredConfig.kt create mode 100644 sdk/explorer-link-android/src/main/java/com/tencent/iot/explorer/link/core/link/listener/WiredConfigListener.kt create mode 100644 sdkdemo/src/main/java/com/tencent/iot/explorer/link/core/demo/activity/WiredConfigNetActivity.kt create mode 100644 sdkdemo/src/main/res/layout/activity_wired_config_net.xml diff --git a/sdk/explorer-link-android/src/main/java/com/tencent/iot/explorer/link/core/link/configNetwork/TIoTCoreUtil.kt b/sdk/explorer-link-android/src/main/java/com/tencent/iot/explorer/link/core/link/configNetwork/TIoTCoreUtil.kt index cb3bdc5bf..03903b86a 100644 --- a/sdk/explorer-link-android/src/main/java/com/tencent/iot/explorer/link/core/link/configNetwork/TIoTCoreUtil.kt +++ b/sdk/explorer-link-android/src/main/java/com/tencent/iot/explorer/link/core/link/configNetwork/TIoTCoreUtil.kt @@ -9,20 +9,30 @@ import com.google.zxing.BarcodeFormat import com.google.zxing.EncodeHintType import com.google.zxing.MultiFormatWriter import com.google.zxing.common.BitMatrix -import com.tencent.iot.explorer.link.core.auth.http.Reconnect import com.tencent.iot.explorer.link.core.link.entity.DeviceInfo import com.tencent.iot.explorer.link.core.link.entity.LinkTask import com.tencent.iot.explorer.link.core.link.entity.SoftAPStep import com.tencent.iot.explorer.link.core.link.listener.SoftAPConfigNetListener import com.tencent.iot.explorer.link.core.link.listener.SoftAPListener +import com.tencent.iot.explorer.link.core.link.listener.WiredConfigListener import com.tencent.iot.explorer.link.core.link.service.SoftAPService +import java.lang.Exception +import java.net.DatagramPacket +import java.net.InetAddress +import java.net.MulticastSocket import java.util.* class TIoTCoreUtil { + val GROUP_ADDRESS = "239.0.0.255" var softAPService: SoftAPService? = null var softAPConfigNetListener: SoftAPConfigNetListener? = null var port = 8266 + @Volatile + var wiredRecvRun = false + var localHostPort = 7838 + var destHostPort = 7838 + var config = WiredConfig() fun generateQrCodeWithConfig(qrcodeConfig: QrcodeConfig): Bitmap? { if (qrcodeConfig.height <= 0 || qrcodeConfig.width <= 0) { @@ -90,5 +100,74 @@ class TIoTCoreUtil { override fun onStep(step: SoftAPStep) {} } + fun configNetByWired(token: String, wiredConfigListener: WiredConfigListener) { + if (wiredConfigListener != null) { + wiredConfigListener.onStartConfigNet() + } + readyReceive(token, wiredConfigListener) + } + + fun send(data: String) { + val group: InetAddress = InetAddress.getByName(GROUP_ADDRESS) + val multicastSocket = MulticastSocket() + Thread(Runnable { + val bytes: ByteArray = data.toByteArray() + val datagramPacket = DatagramPacket(bytes, bytes.size, group, destHostPort) // 发送数据报,指定目标端口和目标地址 + multicastSocket.send(datagramPacket) + }).start() + } + + private fun readyReceive(token: String, wiredConfigListener: WiredConfigListener) { + if (wiredRecvRun) { // 正在配网中,禁止继续 + if (wiredConfigListener != null) { + wiredConfigListener.onConfiging() + } + return + } + wiredRecvRun = true + val inetAddress = InetAddress.getByName(GROUP_ADDRESS) // 多播组 + val multicastSocket = MulticastSocket(localHostPort) // 新建一个socket,绑定接收端口1900 + + multicastSocket.joinGroup(inetAddress) // 加入多播组 + Thread(Runnable { // 定时一分钟后结束有线配网 + Thread.sleep(60 * 1000) + wiredRecvRun = false + if (wiredConfigListener != null) { + wiredConfigListener.onFail() + } + }).start() + + Thread(Runnable { + while (wiredRecvRun) { + val inBuff = ByteArray(256 * 1024) + val inPacket = DatagramPacket(inBuff, inBuff.size) // 构造接收数据报,包含要接收的数据、长度 + inPacket.data = inBuff + multicastSocket.receive(inPacket) // 接收数据报 + var dataStr = String(inPacket.data, inPacket.offset, inPacket.length) + try { + JSONObject.parseObject(dataStr) // 尝试是否是标准的 json 字串,只有标准的 json 才进行后续的解析 + + var recData = JSONObject.parseObject(dataStr, UdpData::class.java) + if (recData != null && recData.status == "received" && + recData.deviceName == config.deviceName && recData.productId == config.productId) { + wiredRecvRun = false; + if (wiredConfigListener != null) { + wiredConfigListener.onSuccess(recData.productId, recData.deviceName) + } + + } else if (recData != null && recData.status == "online") { + config = WiredConfig() + config.productId = recData.productId + config.deviceName = recData.deviceName + config.token = token + send(JSON.toJSONString(config)) + } + } catch (e: Exception) { + e.printStackTrace() + } + } + multicastSocket.close() + }).start() + } } \ No newline at end of file diff --git a/sdk/explorer-link-android/src/main/java/com/tencent/iot/explorer/link/core/link/configNetwork/UdpData.kt b/sdk/explorer-link-android/src/main/java/com/tencent/iot/explorer/link/core/link/configNetwork/UdpData.kt new file mode 100644 index 000000000..f47aac032 --- /dev/null +++ b/sdk/explorer-link-android/src/main/java/com/tencent/iot/explorer/link/core/link/configNetwork/UdpData.kt @@ -0,0 +1,8 @@ +package com.tencent.iot.explorer.link.core.link.configNetwork + +class UdpData { + var productId = "" + var deviceName = "" + var status = "" + var token = "" +} \ No newline at end of file diff --git a/sdk/explorer-link-android/src/main/java/com/tencent/iot/explorer/link/core/link/configNetwork/WiredConfig.kt b/sdk/explorer-link-android/src/main/java/com/tencent/iot/explorer/link/core/link/configNetwork/WiredConfig.kt new file mode 100644 index 000000000..7810defe2 --- /dev/null +++ b/sdk/explorer-link-android/src/main/java/com/tencent/iot/explorer/link/core/link/configNetwork/WiredConfig.kt @@ -0,0 +1,7 @@ +package com.tencent.iot.explorer.link.core.link.configNetwork + +class WiredConfig { + var productId = "" + var deviceName = "" + var token = "" +} \ No newline at end of file diff --git a/sdk/explorer-link-android/src/main/java/com/tencent/iot/explorer/link/core/link/listener/WiredConfigListener.kt b/sdk/explorer-link-android/src/main/java/com/tencent/iot/explorer/link/core/link/listener/WiredConfigListener.kt new file mode 100644 index 000000000..c4e8267e1 --- /dev/null +++ b/sdk/explorer-link-android/src/main/java/com/tencent/iot/explorer/link/core/link/listener/WiredConfigListener.kt @@ -0,0 +1,13 @@ +package com.tencent.iot.explorer.link.core.link.listener + +interface WiredConfigListener { + + fun onStartConfigNet() + + fun onSuccess(productId: String, deviceName: String) + + fun onFail() + + fun onConfiging() + +} \ No newline at end of file diff --git a/sdkdemo/src/main/AndroidManifest.xml b/sdkdemo/src/main/AndroidManifest.xml index de5c1d4c1..6eeaf1d15 100644 --- a/sdkdemo/src/main/AndroidManifest.xml +++ b/sdkdemo/src/main/AndroidManifest.xml @@ -46,6 +46,7 @@ + diff --git a/sdkdemo/src/main/java/com/tencent/iot/explorer/link/core/demo/activity/ConfigNetActivity.kt b/sdkdemo/src/main/java/com/tencent/iot/explorer/link/core/demo/activity/ConfigNetActivity.kt index 197071cfb..10c6081fd 100644 --- a/sdkdemo/src/main/java/com/tencent/iot/explorer/link/core/demo/activity/ConfigNetActivity.kt +++ b/sdkdemo/src/main/java/com/tencent/iot/explorer/link/core/demo/activity/ConfigNetActivity.kt @@ -21,6 +21,10 @@ class ConfigNetActivity : BaseActivity() { tv_ap_config_net.setOnClickListener { jumpActivity(ApConfigNetActivity::class.java) } + + tv_wired_config_net.setOnClickListener { + jumpActivity(WiredConfigNetActivity::class.java) + } } } diff --git a/sdkdemo/src/main/java/com/tencent/iot/explorer/link/core/demo/activity/WiredConfigNetActivity.kt b/sdkdemo/src/main/java/com/tencent/iot/explorer/link/core/demo/activity/WiredConfigNetActivity.kt new file mode 100644 index 000000000..01ac1b6f1 --- /dev/null +++ b/sdkdemo/src/main/java/com/tencent/iot/explorer/link/core/demo/activity/WiredConfigNetActivity.kt @@ -0,0 +1,65 @@ +package com.tencent.iot.explorer.link.core.demo.activity + +import android.os.Handler +import android.text.TextUtils +import android.util.Log +import com.tencent.iot.explorer.link.core.demo.R +import com.tencent.iot.explorer.link.core.link.configNetwork.TIoTCoreUtil +import com.tencent.iot.explorer.link.core.link.entity.LinkTask +import com.tencent.iot.explorer.link.core.link.listener.SoftAPConfigNetListener +import com.tencent.iot.explorer.link.core.link.listener.WiredConfigListener +import kotlinx.android.synthetic.main.activity_ap_config_net.* +import kotlinx.android.synthetic.main.activity_ap_config_net.btn_start_config_net +import kotlinx.android.synthetic.main.activity_ap_config_net.tv_status +import kotlinx.android.synthetic.main.activity_qrcode_config_net.ev_bssid_name +import kotlinx.android.synthetic.main.activity_qrcode_config_net.ev_token +import kotlinx.android.synthetic.main.activity_qrcode_config_net.ev_wifi_name +import kotlinx.android.synthetic.main.activity_qrcode_config_net.ev_wifi_pwd +import kotlinx.android.synthetic.main.activity_wired_config_net.* + +class WiredConfigNetActivity : BaseActivity() { + + var handler = Handler() + var tIoTCoreUtil = TIoTCoreUtil() + + override fun getContentView(): Int { + return R.layout.activity_wired_config_net + } + + override fun initView() { + } + + override fun setListener() { + btn_start_config_net.setOnClickListener { + tIoTCoreUtil.configNetByWired(ev_token.text.toString(), listener) + } + } + + var listener = object: WiredConfigListener { + override fun onStartConfigNet() { + handler.post { + tv_status.setText("start config net") + } + } + + override fun onSuccess(productId: String, deviceName: String) { + handler.post { + tv_status.setText("confignet success productId " + productId + ", deviceName " + deviceName) + } + } + + override fun onFail() { + handler.post { + tv_status.setText("config net failed") + } + } + + override fun onConfiging() { + handler.post { + tv_status.setText("configing") + } + } + + } + +} diff --git a/sdkdemo/src/main/res/layout/activity_config_net_type.xml b/sdkdemo/src/main/res/layout/activity_config_net_type.xml index 513526561..6b8f9e770 100644 --- a/sdkdemo/src/main/res/layout/activity_config_net_type.xml +++ b/sdkdemo/src/main/res/layout/activity_config_net_type.xml @@ -24,4 +24,14 @@ android:text="ap 配网" /> +