在iOS和iPadOS、Android以及Windows中开发基于Wi-Fi、BLE、MQTT等的物联网技术。
万物可以互联,万物也必须互联。
无线网络( Wireless )技术被广泛地使用在智能机器、健康监测、共享单车、智能家电等设备的通讯中,使智能设备轻松地与手机、平板和电脑等交换数据信息。
1895年,意大利无线电工程师、企业家伽利尔摩·马可尼( Guglielmo Marconi ),在意大利的博洛尼亚( Bologna )成功地把无线电信号发送到了1.5英里外的地方,他成为了世界上第一台实用的无线电报系统的发明者,并于1909年获得诺贝尔物理学奖( In recognition of his contributions to the development of wireless telegraphy ),被称作无线电之父。
20世纪90年代,电气和电子工程师协会 Institute of Electrical and Electronics Engineers 成立了802.11工作组。1991年,美国 National Cash Register 公司和其合资伙伴 American Telephone & Telegraph 公司(其前身就是美国贝尔电话 Bell Telephone 公司)在荷兰 Neuwegein 开发出了 WaveLAN 技术,即 Wi-Fi 的雏形。于此同时,悉尼大学的研究机构 Commonwealth Scientific and Industrial Research Organisation 也发明了一种无线网技术,于1996年取得了用于无线局域网标准的底层技术专利,该技术专利跟 IEEE 目前的 802.11a 与 802.11g 无线标准有相当密切的关系。
Intersil 、 3Com 、 Nokia 、 Aironet 、 Symbol 和 Alcatel-Lucent 6家公司,共同组成了无线以太网路相容性联盟( Wireless Ethernet Compatibility Alliance ),对不同厂家的产品进行兼容性认证,实现不同厂家设备间的互操作性。联盟成立之后,为了便于市场推广,于2002年10月选取 Wi-Fi 作为其名称, Wi-Fi 有着 wireless fidelity (无线保真)的含义。WECA 改名为 Wi-Fi 联盟( Wi-Fi Alliance )。
Wi-Fi 通常采用 2.4GHz 和 5GHz 超高频波段。
Camellia 微型控制器可以轻松切换,选择工作在 Access Point 或 Station 模式。
Camellia 微型控制器内部的无线芯片设置为 Access Point 模式,手机、平板、电脑等作为 Station 。
Camellia 微型控制器可以进行路由连接参数或 IP 地址设置。
将手机、平板、电脑连接到安装了 Camellia 微型控制器的智能设备作为服务器的无线网络中,即可直接与通讯。这本质是一种无线局域网。
建立上述物理层的连接后,采用 Transmission Control Protocol 的通讯方式,把Camellia 微型控制器作为服务器,电脑、 Surface 等作为客户端,客户端通过 Internet Protocol 地址和应用程序端口号连接服务器。
把办公室或家中连接到 Internet 的路由器作为 Access Point ,而手机、平板、电脑等作为 Station ,Camellia 微型控制器也作为 Station 。
Camellia 微型控制器可以轻松与任何路由器或手机热点自动连接,连接到互联网络。
这种模式下,手机、平板、电脑与智能设备的通讯,必须经过路由器转发。
如果把手机、平板、电脑和 Camellia 微型控制器设置在不同的局域网络中,即各自连接到不同的路由器。例如 Camellia 微型控制器连接到家中的路由器,在数公里外的办公室中,手机、平板、电脑连接到办公室的路由器,两个路由器又同时连接到 Internet ,或是手机、平板、电脑直接通过 4G 或 5G 蜂窝通讯技术连接到 Internet ,就可以通过 MQTT 技术实现远程控制,这样无论你坐在办公室中,或是漫步在公园中,你都可以轻点手机,轻松操作在家中的安装了 Camellia 微型控制器的机器人或智能设备,打造了自己的远程物联网络。
MainActivity activity = (MainActivity) getActivity();
Context mcontext = activity.getApplicationContext();
ConnectivityManager mConnectivityManager = (ConnectivityManager) mcontext.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWiFiNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
// 首先检查手机等设备的 Wi-Fi 功能是否开启,并通过检查手机 IP 地址等方式检测是否与路由器相连通。
if( mWiFiNetworkInfo != null && mWiFiNetworkInfo.isConnected() ) {
WifiManager mWifiManager = (WifiManager) mcontext.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
// ...
}
else{
// ...
}
private Socket mSocket = new Socket();
private OutputStream mOutputStream = null;
private InputStream mInputStream = null;
private InetAddress mIPAddress;
public int mDevicePortWiFi;
// 服务器 IP 地址
public String mDeviceAddressWiFi = "192.168.4.1";
private byte[] bufWiFi = new byte[64];
// 定义线程设置,这里对于连接操作、发送数据操作、接收数据操作分别采用不同的子线程。
private ConnectSeverThread mConnectThread;
private SendtoSeverThread mSendThread;
private ReceivefromSeverThread mReceiveThread;
public void ConnecttoServer(){
mConnectThread = new ConnectSeverThread();
mConnectThread.start();
}
private class ConnectSeverThread extends Thread {
public void run() {
try
{
mIPAddress = InetAddress.getByName(mDeviceAddressWiFi);
mSocket = new Socket(mIPAddress, mDevicePortWiFi);
// 可以设置连接超时限制
// mSocket = new Socket();
// SocketAddress socAddress = new InetSocketAddress(mIPAddress, mDevicePortWiFi);
// mSocket.connect(socAddress, 5000);
runOnUiThread(new Runnable() {
public void run() {
}
});
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
public void sendDataWiFi(byte[] data) {
if( mSocket.isClosed() == false ) {
for( i = 0 ; i < 64 ; i++ ){
bufWiFi[i] = data[i];
}
mSendThread = new SendtoSeverThread();
mSendThread.start();
}
}
// 触发发送数据线程:
private class SendtoSeverThread extends Thread {
public void run() {
if( mSocket.isClosed() == false ) {
try
{
mOutputStream = mSocket.getOutputStream();
mOutputStream.write(bufWiFi);
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
}
public void receiveDataWiFi( ) {
if( mSocket.isClosed() == false ) {
mReceiveThread = new ReceivefromSeverThread();
mReceiveThread.start();
}
}
// 触发接收数据线程:
private class ReceivefromSeverThread extends Thread {
public void run() {
if( mSocket.isClosed() == false ) {
try
{
mInputStream = mSocket.getInputStream();
// 中文 GBK 编码
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(mInputStream,"GB18030"));
// UTF-8 编码
// BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(mInputStream,"UTF-8"));
}
catch(UnsupportedEncodingException e)
{
e.printStackTrace();
}
}
}
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// ...
}
}
Message msg = new Message();
handler.sendMessage(msg);
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
string ipAddress = null;
// 程序中首先检查电脑或Surface的 Wi-Fi 功能是否开启,并通过检查电脑或Surface的 IP 地址等方式检测是否与路由器相连通。
foreach (NetworkInterface adapter in nics)
{
/// Wi-Fi
if (adapter.NetworkInterfaceType == NetworkInterfaceType.Wireless80211)
{
IPInterfaceProperties ip = adapter.GetIPProperties();
UnicastIPAddressInformationCollection ipCollection = ip.UnicastAddresses;
foreach (UnicastIPAddressInformation ipadd in ipCollection)
{
if (ipadd.Address.AddressFamily == AddressFamily.InterNetwork)
{
ipAddress = ipadd.Address.ToString();
}
}
}
}
// 定义 Socket 变量,同时定义服务器的 IP 地址和端口号变量,不同的应用程序采用不同的端口。
public Socket clientSocket;
public IPAddress wifiserverIP = IPAddress.Parse("192.168.4.1");
public int wifiPort = 14615;
try
{
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(wifiserverIP, wifiPort);
}
catch (Exception error)
{
}
public bool SocketSendMsg(byte[] data)
{
if ( (clientSocket == null)&&(clientSocket.Connected) )
{
clientSocket.Send(data);
}
}
Thread receiveThread = new Thread(SocketReceiveMsg);
receiveThread.Start();
public bool SocketSendMsg()
{
byte[] result = new byte[1024];
if ( (clientSocket == null)&&(clientSocket.Connected) )
{
int receiveLength = clientSocket.Receive(result);
string resultStr = Encoding.Default.GetString(result, 0, receiveLength);
/// 其他编码方式
// Encoding.ASCII
// Encoding.UTF8
}
}
string resultStr = "My dear Camellia!";
mqttInvoke mi = new mqttInvoke(messageSetText);
BeginInvoke(mi, resultStr);
public void messageSetText(string str)
{
/// str is resultStr in Main Class
}
// 程序中首先检查 iPhone 或 iPad 的 Wi-Fi 功能是否开启,并通过检查 iPhone 或 iPad 的 IP 地址等方式检测是否与路由器相连通。
let reachability = try? Reachability()
if(reachability != nil){
if(reachability?.connection == .wifi){
print("Reachable via WiFi!")
}
}
let mresult = getMAC()
if((mresult.success)){
mdevice.text = mresult.ssid
print("Wi-Fi is OK!")
}
let msocket = try? Socket.create()
// 根据服务器的 IP 地址和端口号,进行连接,不同的应用程序采用不同的端口。
if(msocket != nil){
if(msocket!.isConnected == false){
do{
try msocket?.connect(to: "192.168.4.1", port: 14615)
print("Wi-Fi Connect successfully!")
}
catch{
print("Wi-Fi Connect error: ")
print(error)
}
}
}
if( (msocket != nil)&&(msocket!.isConnected) ){
do{
try msocket?.write(from: writedata)
}
catch{
print("Message Write error:")
print(error)
}
}
if( (msocket != nil)&&(msocket!.isConnected) ){
var readdata : String = "noresponse"
do{
readdata = try (self.msocket?.readString() ?? "noresponse")
print(readdata)
}
catch{
print("Read error:")
print(error)
}
}
-- | Android | Windows | iOS and iPadOS |
BLE | JAVA code using android.bluetooth | -------------------------------- | Swift code using CoreBluetooth |
Wi-Fi | JAVA code using socket | C# code using socket | Swift code using socket |
MQTT | JAVA code using Eclipse Paho | C# code using C# M2MQTT.NET | Swift code using CocoaMQTT |