[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
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; }
}
}
}
Như vậy là xong, các bạn có thể tải source code về test thử nhé.
Chúc các bạn thành công.
Theo LapTrinhVB.Net
![[C#] Connect Phone via Bluetooth Application Winform [C#] Connect Phone via Bluetooth Application Winform](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOII58gvwMzoUDRMUtcT6a25yzfPKoS1ufPEUxZ4NFK5W4GPdyQZ_PFmIUp3mMRHGRMa8IrXrjSO0PmQYHqPdgPI55_SRvxHfFR-T-ATecnDjMRpstVuUUVBoACeGljBJyEZi5cpxzuCGYSbM-NwmwsS4sjMX6KzFHq7D56fD4OQebnxID1p7vDghdeeQ/w640-h290/app_bluetooth.png)

Comments
kết nối với điện thoại để làm gì a?
ReplyDelete