- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
[C#] Kết nôi điện thoại Android, IOS với App Winform via Bluetooth
Xin chào các bạn, bài viết hôm nay mình chia sẻ các bạn source code kết nối điện thoại Android/IOS với ứng dụng c# winform.
[C#] Connect Phone via Bluetooth Application Winform
Giao diện demo ứng dụng:
Ứng dụng này thực hiện các tính năng sau:
- Tìm kiếm các thiết bị Bluetooth
- Kết nối với thiết bị
- Thực hiện cuộc gọi từ ứng dụng
- Xem lịch sử cuộc gọi đến và đi theo thời gian thực
Đầu tiên, các bạn cần cài đặt thư viện để làm việc kết nối với Bluetooth từ Nuget C#.
NuGet\Install-Package InTheHand.Net.Bluetooth -Version 4.0.36
Source code C#:
using InTheHand.Net;
using InTheHand.Net.Bluetooth;
using InTheHand.Net.Sockets;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CallInfoViaBT
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}
private Stream peerStream;
private BluetoothClient client;
private void button1_Click(object sender, EventArgs e)
{
if (client == null || client.Connected == false)
{
MessageBox.Show("Please make sure you have connected to device.");
return;
}
string[] dialCmd = new string[6];
dialCmd[0] = "AT+CMER\r";
dialCmd[1] = "AT+CIND=?\r";
dialCmd[3] = "ATD +"+TB_phoneNumber.Text+";\r";
runCommand(dialCmd[0], peerStream);
runCommand(dialCmd[1], peerStream);
runCommand(dialCmd[3], peerStream);
}
private void runCommand(string command, Stream peerStream)
{
Byte[] sRes = new Byte[200];
Byte[] dcB = System.Text.Encoding.ASCII.GetBytes(command);
peerStream.Write(dcB, 0, dcB.Length);
}
public static String bytesToString(byte[] data)
{
String dataOut = "";
for (int i = 0; i < data.Length; i++)
{
if (data[i] != 0x00)
dataOut += (char)data[i];
}
return dataOut;
}
private void connectButton_Click(object sender, EventArgs e)
{
var deviceAddr = discoveredDevices.SelectedValue.ToString();
BluetoothAddress addr = BluetoothAddress.Parse(deviceAddr);
BluetoothEndPoint rep = new BluetoothEndPoint(addr, BluetoothService.Handsfree);
client.Connect(rep);
peerStream = client.GetStream();
backgroundWorker1.RunWorkerAsync();
//Get call AT commands
string[] dialCmd = new string[50];
dialCmd[0] = "AT\r";
dialCmd[1] = "AT+CMER=3,0,0,1,0\r";
dialCmd[2] = "AT+CLIP=1\r";
runCommand(dialCmd[0], peerStream);
runCommand(dialCmd[1], peerStream);
runCommand(dialCmd[2], peerStream);
}
private void closeConnection(object sender, FormClosedEventArgs e)
{
if (client != null && client.Connected == true)
{
peerStream.Close();
client.Close();
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
Console.WriteLine("Waiting for response..");
Byte[] sRes = new Byte[200];
peerStream.Read(sRes, 0, 199);
var resStr = bytesToString(sRes);
Console.WriteLine(resStr);
if (resStr.Contains("CLIP"))
{
onCallWithCLIP(resStr);
}
else if (resStr.Contains("3,1"))
{
onCall(true);
}
else if (resStr.Contains("3,3"))
{
onCall(false);
}
Thread.Sleep(500);
}
}
private void onCallWithCLIP(string resStr)
{
//YES! Now I have call information.
Console.WriteLine("Call information: " + resStr);
char[] phoneNumber = new char[16];
int startPhoneNoIndex = resStr.IndexOf("\"");
int endPhoneNoIndex = resStr.IndexOf("\"", startPhoneNoIndex + 1);
resStr.CopyTo(startPhoneNoIndex + 1, phoneNumber, 0, endPhoneNoIndex - startPhoneNoIndex - 1);
string strPhoneNumber = new string(phoneNumber);
strPhoneNumber = strPhoneNumber.Trim('\0');
Console.WriteLine("Tel no: " + strPhoneNumber);
if (!resStr.Contains("CIEV")) return;
string[] row = { DateTime.Now.ToShortTimeString(), strPhoneNumber, "N/A" };
var listViewItem = new ListViewItem(row);
LWCalls.Items.Add(listViewItem);
sendNotification("There is a new incoming call from " + strPhoneNumber);
}
private void onCall(bool incoming)
{
try
{
string getCurrentCallCmd = "AT + CLCC ?\r";
Byte[] sRes = new Byte[200];
Byte[] dcB = System.Text.Encoding.ASCII.GetBytes(getCurrentCallCmd);
peerStream.Write(dcB, 0, dcB.Length);
peerStream.Read(sRes, 0, 199);
var resStr = bytesToString(sRes);
if (resStr.Contains("+CLCC"))
{
//YES! Now I have call information.
Console.WriteLine("Call information: " + resStr);
char[] phoneNumber = new char[16];
char[] contactName = new char[256];
//Let's get phone number. Listen this now: https://open.spotify.com/track/1jr1BnpXymcf2i97mTR8tJ?si=Z1xdaa5gTu6kKSg3D3X8Qg
int startPhoneNoIndex = resStr.IndexOf("\"");
int endPhoneNoIndex = resStr.IndexOf("\"", startPhoneNoIndex + 1);
resStr.CopyTo(startPhoneNoIndex + 1, phoneNumber, 0, endPhoneNoIndex - startPhoneNoIndex - 1);
string strPhoneNumber = new string(phoneNumber);
strPhoneNumber = strPhoneNumber.Trim('\0');
Console.WriteLine("Tel no: " + strPhoneNumber);
//Now, it is time to get contact name, if the caller is not saved in phone. Now listen this: https://open.spotify.com/track/3G2zIBotS9OUCK5uaHN2hz?si=XgF-V-JLQ26ucMLy3JCc3Q
int startContactIndex = resStr.IndexOf("\"", endPhoneNoIndex + 1);
int endContactIndex = resStr.IndexOf("\"", startContactIndex + 1);
resStr.CopyTo(startContactIndex + 1, contactName, 0, endContactIndex - startContactIndex - 1);
string strContactName = new string(contactName);
strContactName = strContactName.Trim('\0');
Console.WriteLine("Contact Name: " + strContactName);
string[] row = { DateTime.Now.ToShortTimeString(), strPhoneNumber, strContactName };
var listViewItem = new ListViewItem(row);
if (incoming)
{
LWCalls.Items.Add(listViewItem);
sendNotification("There is a new incoming call from " + strPhoneNumber);
}
else
{
LWOutCalls.Items.Add(listViewItem);
sendNotification("There is a new outgoing call to " + strPhoneNumber);
}
}
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
private void findButton_Click(object sender, EventArgs e)
{
discoveredDevices.DisplayMember = "DeviceName";
discoveredDevices.ValueMember = "DeviceAddress";
Cursor.Current = Cursors.WaitCursor;
var devices = client.DiscoverDevices();
discoveredDevices.DataSource = devices;
Cursor.Current = Cursors.Default;
warningLabel.Visible = true;
connectButton.Enabled = true;
discoveredDevices.Enabled = true;
callButton.Enabled = true;
}
private void Form1_Load(object sender, EventArgs e)
{
Console.SetOut(new MultiTextWriter(new ControlWriter(richTextBox1), Console.Out));
client = new BluetoothClient();
warningLabel.Visible = false;
connectButton.Enabled = false;
discoveredDevices.Enabled = false;
callButton.Enabled = false;
}
private void sendNotification(string msg)
{
NotifyIcon MyIcon = new NotifyIcon();
MyIcon.Visible = true;
MyIcon.Icon = System.Drawing.SystemIcons.Information;
MyIcon.Text = "Call Information";
MyIcon.BalloonTipTitle = "Call Information";
MyIcon.BalloonTipText =msg;
MyIcon.BalloonTipIcon = ToolTipIcon.Info;
MyIcon.ShowBalloonTip(5000);
}
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
richTextBox1.SelectionStart = richTextBox1.Text.Length;
richTextBox1.ScrollToCaret();
}
}
public class MultiTextWriter : TextWriter
{
private IEnumerable<TextWriter> writers;
public MultiTextWriter(IEnumerable<TextWriter> writers)
{
this.writers = writers.ToList();
}
public MultiTextWriter(params TextWriter[] writers)
{
this.writers = writers;
}
public override void Write(char value)
{
foreach (var writer in writers)
writer.Write(value);
}
public override void Write(string value)
{
foreach (var writer in writers)
writer.Write(value);
}
public override void Flush()
{
foreach (var writer in writers)
writer.Flush();
}
public override void Close()
{
foreach (var writer in writers)
writer.Close();
}
public override Encoding Encoding
{
get { return Encoding.ASCII; }
}
}
public class ControlWriter : TextWriter
{
private Control richTextBox;
public ControlWriter(Control textbox)
{
this.richTextBox = textbox;
}
public override void Write(char value)
{
richTextBox.Text += value;
}
public override void Write(string value)
{
richTextBox.Text += value;
}
public override Encoding Encoding
{
get { return Encoding.ASCII; }
}
}
}
Thanks for watching!