在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 |